我正在使用一个csv列表,它具有大约7000个项目,并且具有某些键,但是我想创建一个可以向其添加新行的函数,该函数是通过将价格除以权重和然后根据该数字对项目进行排序。
我已经有了数字(价格/重量),我通过一个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:字典在迭代过程中更改了大小
答案 0 :(得分:1)
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]})
答案 1 :(得分:0)
如果您的dict
包含嵌套的dict
,则需要修改该下标,而不是外部下标:
for key in copy:
copy[key].update({'newkey': newkey})
如其他答案所指出,要创建副本,请使用:
copy = dictionary.copy()
尽管最好使用copy.deepcopy()
,因为您有嵌套的字典。
答案 2 :(得分:0)
您可以用dict理解替换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。它应该更快。