如何将新行添加到具有相同键的多个项目的字典中?
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。应该会更快。
我正在使用一个 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。应该会更快。