如何修改Python字典值并创建字典列表?

时间:2016-06-01 11:09:15

标签: python list dictionary append

我想修改字典并创建一个包含带有修改值的字典的列表。我试过了:

mylist = []
mydict = {"one": 10, "two": 20, "three": 30}
for i in [111, 222, 333]:
   mydict["two"] = i
   mylist.append(mydict)

mylist返回:

[{'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}]

我该怎么做?

1 个答案:

答案 0 :(得分:4)

那是因为您只是创建对同一对象(您的字典)的多个引用,并将一次性变量i分配给您在最后一次迭代中保存333并将其分配给two键的键。 ,所有字典名称都将指向具有项('two', 333)的同一对象。

你可以使用dict理解来解决这个问题:

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