Python 编辑嵌套字典在相同键中复制值

Python 编辑嵌套字典在相同键中复制值,python,dictionary,Python,Dictionary,我有一个结构相同的目录列表 [{"Program Name": "Bulldozer", "Level": 3}, {"Program Name": "Robot", "Level": 1}, {"Program Name": "Bulldozer", "Level": 4}] 我想要的是具有相同值的“程序名”的重复

我有一个结构相同的目录列表

[{"Program Name": "Bulldozer", "Level": 3}, {"Program Name": "Robot", "Level": 1}, {"Program Name": "Bulldozer", "Level": 4}]
我想要的是具有相同值的“程序名”的重复键(例如:出现2x的“推土机”)被重命名为“推土机(1)”、“推土机(2)”等等。

希望这有助于:

input = [{"Program Name": "Bulldozer", "Level": 3}, {"Program Name": "Robot", "Level": 1}, {"Program Name": "Bulldozer", "Level": 4}]

def update_input(input):

    existing_program_names = {}

    for i, d in enumerate(input):
        current_list_program_name = d['Program Name']

        try:
            existing_program_names[current_list_program_name] += 1
        except KeyError:
            # Program name not in storage yet add it
            existing_program_names.update({current_list_program_name: 0})

        if existing_program_names[current_list_program_name] > 0 :
            ID = existing_program_names[current_list_program_name]
            input[i]['Program Name'] = current_list_program_name + ' ({ID})'.format(ID=ID)
        else:
            pass
    return input

output = update_input(input)
收益率:

[{'Program Name': 'Bulldozer', 'Level': 3}, {'Program Name': 'Robot', 'Level': 1}, {'Program Name': 'Bulldozer (1)', 'Level': 4}]
希望这有助于:

input = [{"Program Name": "Bulldozer", "Level": 3}, {"Program Name": "Robot", "Level": 1}, {"Program Name": "Bulldozer", "Level": 4}]

def update_input(input):

    existing_program_names = {}

    for i, d in enumerate(input):
        current_list_program_name = d['Program Name']

        try:
            existing_program_names[current_list_program_name] += 1
        except KeyError:
            # Program name not in storage yet add it
            existing_program_names.update({current_list_program_name: 0})

        if existing_program_names[current_list_program_name] > 0 :
            ID = existing_program_names[current_list_program_name]
            input[i]['Program Name'] = current_list_program_name + ' ({ID})'.format(ID=ID)
        else:
            pass
    return input

output = update_input(input)
收益率:

[{'Program Name': 'Bulldozer', 'Level': 3}, {'Program Name': 'Robot', 'Level': 1}, {'Program Name': 'Bulldozer (1)', 'Level': 4}]
你也可以试试这个:

data = [
    {"Program Name": "Bulldozer", "Level": 3},
    {"Program Name": "Robot", "Level": 1},
    {"Program Name": "Bulldozer", "Level": 4},
    {"Program Name": "Rozer", "Level": 3},
    {"Program Name": "Robot", "Level": 1},
    {"Program Name": "Rozer", "Level": 3},
    {"Program Name": "Bulldozer", "Level": 3},
    {"Program Name": "Robot", "Level": 1},
    {"Program Name": "Bulldozer", "Level": 4},
    {"Program Name": "Rozer", "Level": 3},
    {"Program Name": "Robot", "Level": 1},
    {"Program Name": "Rozer", "Level": 3}
]
进近:01

import pandas as pd


c = pd.DataFrame(data)
c['group_code'] = c.groupby(['Program Name']).cumcount() + 1
c['Program Name'] = ["{0} ({1})".format(x, y) for (x, y) in c[[
    'Program Name', 'group_code']].values]
output = c[['Program Name', 'Level']].to_dict(orient='records')
print(output)

进近:02

temp = {}
for item in data:
    temp.update(
        {
            item['Program Name']: temp[item['Program Name']] + 1 if temp.get(item['Program Name']) else 1
        }
    )
    item['Program Name'] = item['Program Name'] + ' (' + str(temp[item['Program Name']]) + ')'

print(data)
输出:

[
    {"Program Name": "Bulldozer (1)", "Level": 3},
    {"Program Name": "Robot (1)", "Level": 1},
    {"Program Name": "Bulldozer (2)", "Level": 4},
    {"Program Name": "Rozer (1)", "Level": 3},
    {"Program Name": "Robot (2)", "Level": 1},
    {"Program Name": "Rozer (2)", "Level": 3},
    {"Program Name": "Bulldozer (3)", "Level": 3},
    {"Program Name": "Robot (3)", "Level": 1},
    {"Program Name": "Bulldozer (4)", "Level": 4},
    {"Program Name": "Rozer (3)", "Level": 3},
    {"Program Name": "Robot (4)", "Level": 1},
    {"Program Name": "Rozer (4)", "Level": 3}
]
如果您有大量数据,我建议您使用熊猫(方法01)。

您也可以尝试以下方法:

data = [
    {"Program Name": "Bulldozer", "Level": 3},
    {"Program Name": "Robot", "Level": 1},
    {"Program Name": "Bulldozer", "Level": 4},
    {"Program Name": "Rozer", "Level": 3},
    {"Program Name": "Robot", "Level": 1},
    {"Program Name": "Rozer", "Level": 3},
    {"Program Name": "Bulldozer", "Level": 3},
    {"Program Name": "Robot", "Level": 1},
    {"Program Name": "Bulldozer", "Level": 4},
    {"Program Name": "Rozer", "Level": 3},
    {"Program Name": "Robot", "Level": 1},
    {"Program Name": "Rozer", "Level": 3}
]
进近:01

import pandas as pd


c = pd.DataFrame(data)
c['group_code'] = c.groupby(['Program Name']).cumcount() + 1
c['Program Name'] = ["{0} ({1})".format(x, y) for (x, y) in c[[
    'Program Name', 'group_code']].values]
output = c[['Program Name', 'Level']].to_dict(orient='records')
print(output)

进近:02

temp = {}
for item in data:
    temp.update(
        {
            item['Program Name']: temp[item['Program Name']] + 1 if temp.get(item['Program Name']) else 1
        }
    )
    item['Program Name'] = item['Program Name'] + ' (' + str(temp[item['Program Name']]) + ')'

print(data)
输出:

[
    {"Program Name": "Bulldozer (1)", "Level": 3},
    {"Program Name": "Robot (1)", "Level": 1},
    {"Program Name": "Bulldozer (2)", "Level": 4},
    {"Program Name": "Rozer (1)", "Level": 3},
    {"Program Name": "Robot (2)", "Level": 1},
    {"Program Name": "Rozer (2)", "Level": 3},
    {"Program Name": "Bulldozer (3)", "Level": 3},
    {"Program Name": "Robot (3)", "Level": 1},
    {"Program Name": "Bulldozer (4)", "Level": 4},
    {"Program Name": "Rozer (3)", "Level": 3},
    {"Program Name": "Robot (4)", "Level": 1},
    {"Program Name": "Rozer (4)", "Level": 3}
]

如果您有大量数据,我建议您使用
pandas(方法01)

一种有效的方法是使用
defaultdict
来计算
程序名
,即时间复杂度 is
O(n)

结果:

[{'Program Name': 'Bulldozer', 'Level': 3}, {'Program Name': 'Robot', 'Level': 1}, {'Program Name': 'Bulldozer (1)', 'Level': 4}, {'Program Name': 'Bulldozer (2)', 'Level': 4}, {'Program Name': 'Robot (1)', 'Level': 1}]

一种有效的方法是使用
defaultdict
计算
“程序名”
,即时间复杂度 is
O(n)

结果:

[{'Program Name': 'Bulldozer', 'Level': 3}, {'Program Name': 'Robot', 'Level': 1}, {'Program Name': 'Bulldozer (1)', 'Level': 4}, {'Program Name': 'Bulldozer (2)', 'Level': 4}, {'Program Name': 'Robot (1)', 'Level': 1}]

感谢@jizhihaoSAMA,我通过一个小编辑找到了解决问题的方法

machines = [{"Program Name": "Bulldozer", "Level": 3}, {"Program Name": "Robot", "Level": 1}, {"Program Name": "Bulldozer", "Level": 4}]
        tmp = defaultdict(int)
        for i in machines:
            name = i["Program Name"].strip(f' ({tmp[i["Program Name"]]})')
            i["Program Name"] = f'{name} ({tmp[i["Program Name"]]})' if tmp[name] else i["Program Name"]
            tmp[name] += 1

这将禁用程序名或任何复杂名称中的空格问题。

多亏了@jizhaosama,我通过一个小编辑就找到了解决问题的方法

machines = [{"Program Name": "Bulldozer", "Level": 3}, {"Program Name": "Robot", "Level": 1}, {"Program Name": "Bulldozer", "Level": 4}]
        tmp = defaultdict(int)
        for i in machines:
            name = i["Program Name"].strip(f' ({tmp[i["Program Name"]]})')
            i["Program Name"] = f'{name} ({tmp[i["Program Name"]]})' if tmp[name] else i["Program Name"]
            tmp[name] += 1


这将禁用程序名或任何复杂名称中的空格问题。

您可以分享您的尝试吗?您的输入正确吗?一个列表怎么会有键值对?顺序重要吗?@jizhaosama它不重要。你能分享你的尝试吗?你的输入正确吗?一个列表怎么会有键值对?顺序有关系吗?@jizhaosama它没有推土机只是一个例子。列表有10000个dict和许多不同的程序名称虽然
方法2
与@jizhaosama answer非常相似。推土机只是一个例子。列表有10000个dict和许多不同的程序名称,尽管
方法2
与@jizhihaoSAMA answer非常相似。似乎用空格分隔名称,比如如果我有一个带有“推土机兰博”的程序名,它将开始收集自己的推土机名称,而不是整个“推土机兰博”名称。通过删除split()[0]@Crapy修复了此问题。您可以使用
tmp[“”.join(i[“程序名”].split()[:-1])]+=1
或regex来拆分它们。@Crapy如果删除
split
,全名
“xxx(1)”
将添加到
tmp
中,这不是您想要的。您可以使用print(tmp)查看它。当有三个或更多重复的
“程序名”
时,这将发生一些意外行为。我尝试了使用split()[:-1]的解决方案,但它似乎不适用于复杂的名称,例如推土机Mega(Q7-4)似乎用空格分隔名称,就像我有一个带有“推土机Rambo”的程序名一样它将开始收集自己的推土机名称,而不是整个“推土机兰博”的名称。通过删除split()[0]@Crapy修复了此问题。您可以使用
tmp[“”.join(i[“程序名”].split()[:-1])]+=1
或regex来拆分它们。@Crapy如果删除
split
,全名
“xxx(1)”
将添加到
tmp
中,这不是您想要的。您可以使用print(tmp)查看。当存在三个或更多重复的
“程序名”
时,会出现一些意外行为。我尝试了使用split()[:-1]的解决方案,但它似乎不适用于复杂的名称,例如推土机Mega(Q7-4)