在循环中将字典添加到列表的末尾

66
我正在尝试将一个字典添加到列表中。然后在循环中更改字典的值,再次将其附加到列表中。似乎每次这样做时,列表中的所有字典都会更改它们的值以匹配刚刚附加的那个字典。 例如:
>>> dict = {}
>>> list = []
>>> for x in range(0,100):
...     dict[1] = x
...     list.append(dict)
... 
>>> print list

我原本认为结果会是 [{1:1}, {1:2}, {1:3}... {1:98}, {1:99}],但实际上得到的却是:

[{1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}, {1: 99}]

7
你正在用相同的引用填充“列表”(不应该命名为“列表”)和“字典”(不应该称为“字典”)。 - jonrsharpe
5个回答

99
你需要追加一个副本,否则你只是不断地添加对同一字典的引用:
yourlist.append(yourdict.copy())

我使用了yourdictyourlist而不是dictlist;你不想掩盖内置类型。


15

当你在循环外创建adict字典时,你将相同的字典附加到alist列表中。这意味着所有的副本都指向同一个字典,每次都会得到最后一个值{1:99}。只需在循环内部创建每个字典,现在你有了100个不同的字典。

alist = []
for x in range(100):
    adict = {1:x}
    alist.append(adict)
print(alist)

11

只需要把 dict = {} 放在循环里面。

>>> dict = {}
>>> list = []
>>> for x in range(0, 100):
       dict[1] = x
       list.append(dict)
       dict = {}

>>> print list

6
您可以使用 zip 和列表推导式来完成您需要的操作。
如果您希望字典值从1开始,请使用 range(1,100)
l = [dict(zip([1],[x])) for x in range(1,100)]

2

假设d是您的字典。在这里,如果您执行d.copy()。它会返回浅层副本,当您将嵌套字典放入d字典中时,它不起作用。为了克服这个问题,我们必须使用deepcopy

from copy import deepcopy
list.append(deepcopy(d))

它完美地工作了!!!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接