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

标签 python list dictionary append

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

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/

相关文章:

jquery - 根据类别和职位返回列表项

java - 如何在数组中转换列表?在 java

python - scipy.interpolate.make_interp_spline如何检索所有系数?

python在列表循环中引用前面的项目

Python。使用字典列表进行操作

python - 检查字典中是否存在键或值

c# - 查找值在字典中的范围

python - 一次进行多个单独的 2d 旋转

python - PyQt4:创建返回参数的自定义对话框

python - 无法访问请求中的值