我想修改字典并创建一个包含具有修改值的字典的列表。我尝试过:
mylist = []
mydict = {"one": 10, "two": 20, "three": 30}
for i in [111, 222, 333]:
mydict["two"] = i
mylist.append(mydict)
我的列表返回:
[{'three': 30, 'two': 333, 'one': 10}, {'three': 30, 'two': 333, 'one': 10}, {'three': 30, 'two': 333, 'one': 10}]
我期望得到:
[{'three': 30, 'two': 111, 'one': 10}, {'three': 30, 'two': 222, 'one': 10}, {'three': 30, 'two': 333, 'one': 10}]
我该怎么做?
最佳答案
那是因为您只是创建对同一对象(您的字典)的多个引用,并通过将一次性变量 i
分配给您的键(在最后一次迭代中保存 333)并将其分配给 Two
键,所有字典名称都将指向与项目 ('two', 333)
相同的对象。
您可以使用字典理解来解决这个问题:
>>> mylist = [{"one": 10, "two": i, "three": 30} for i in [111, 222, 333]]
>>> mylist
[{'three': 30, 'two': 111, 'one': 10}, {'three': 30, 'two': 222, 'one': 10}, {'three': 30, 'two': 333, 'one': 10}]
或者,您可以在每次迭代中创建初始对象的副本,以便创建新对象,而不仅仅是复制引用。
>>> from copy import copy
>>> mylist = []
>>> mydict = {"one": 10, "two": 20, "three": 30}
>>> for i in [111, 222, 333]:
... mydict["two"] = i
... mylist.append(copy(mydict))
...
>>> mylist
[{'one': 10, 'three': 30, 'two': 111}, {'one': 10, 'three': 30, 'two': 222}, {'one': 10, 'three': 30, 'two': 333}]
如果你有多个想要修改的键,作为一种更Pythonic的方法,你可以这样做:
>>> for i, j in zip(my_keys, my_new_values):
... mydict[i] = j
... mylist.append(copy(mydict))
关于python - 如何修改Python字典值并创建字典列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37566954/