如何将新行添加到具有相同键的多个项目的字典中?

How can I add a new row into a dictionary of multiple items with the same key?

我正在使用一个 csv 列表,它有大约 7000 个项目,它有特定的键,但我想创建一个可以向它添加新行的函数,它来自将价格除以重量,然后根据该数字对项目进行排序。

我已经有了号码(price/weight),我是用for循环做的:

def ideal(dictionary):
    list2=list(dictionary)
    for x in range (len(list2)):
        Keys=list(dictionary[list2[x]])
        dict2=dictionary[list2[x]]
        column=list(map(dict2.get,Keys))
        newkey=(float(column[1]))/(float(column[2]))

我尝试制作一个 for 循环,以便插入新行。字典格式如下所示:

'chips': {'category': 'food', 'price': '345.0', 'weight[kg]': '0.2',
'volume[m3]': '0.5545'}, 'broccoli': {'category': 'food', 'price': '449.0',
'weight[kg]': '2.72', 'volume[m3]': '0.5492'}, 'ham': {'category': 'food',
'price': '680.0', 'weight[kg]': '22.57', 'volume[m3]': '0.1359'}
}

还有更多类别,例如:杂货店

def ideal(dictionary):
    ####newkey is a float
    copy=dictionary
    for x in copy:
        dictionary.update( {"newkey":newkey})

但是我得到这个错误。

RuntimeError: dictionary changed size during iteration

copy=dictionary 不制作副本,但使 copy 成为对 dictionary 的引用,因此出现错误 RuntimeError: dictionary changed size during iteration,因为您在迭代字典时正在修改它

而不是复制你想做的事copy=dictionary.copy() 然后您可以遍历字典并更新嵌套字典

def ideal(dictionary, newkey_list):
    #Make copy of dictionary
    copy=dictionary.copy()

    #Iterate through the dictionary
    for idx, value in enumerate(copy.values()):
        #Update nested dictionary with appropriate newkey
        value.update( {"newkey":newkey_list[idx]})

如果您的 dict 包含嵌套的 dict,您需要修改子字典,而不是外部子字典:

for key in copy:
    copy[key].update({'newkey': newkey})

正如其他答案中所指出的,要创建副本,请使用:

copy = dictionary.copy()

尽管使用 copy.deepcopy() 可能更好,因为您有嵌套字典。

你可以用字典理解替换ideal()

ideal_dict = {k: {**v, "new_key": v["old_key"] ** 2} for k, v in old_dict.items()}

或者如果您想更新旧词典:

old_dict.update({k: {**v, "new_key": v["old_key"] ** 2} for k, v in old_dict.items()})

P.S。应该会更快。