在相同的键中编辑嵌套的字典重复值

时间:2020-09-04 03:05:37

标签: python dictionary

我有一个结构相同的字典

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

我想要的是具有相同值(例如:“ Bulldozer”出现2倍)的“程序名称”重复键,将其重命名为“ Bulldozer(1)”,“ Bulldozer(2)”,依此类推。 / p>

4 个答案:

答案 0 :(得分:2)

一种有效的方法是使用 axios.post('/api/prequalify',{_token:csrfToken,data:state.LoanCalculator}) .then(res => { console.log(res); }) 来计算defaultdict的时间复杂度 是"Program Name"

O(n)

结果:

from collections import defaultdict

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

tmp = defaultdict(int)
for i in l:
    i["Program Name"] = f'{i["Program Name"]} ({tmp[i["Program Name"]]})' if tmp[i["Program Name"]] else i["Program Name"]
    tmp[i["Program Name"].split()[0]] += 1

print(l)

答案 1 :(得分:0)

希望这会有所帮助:

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}]

答案 2 :(得分:0)

您也可以尝试以下方法:

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}
]

Approach: 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)

Approach: 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(approach 01)

答案 3 :(得分:0)

感谢@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

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