创建一个空列表字典,其中的列表不是同一个列表

4
我正在尝试创建一个字典列表,可以在循环中添加。然而,如果我使用fromkeys创建字典,则该列表成为“指针”的副本,而不是新列表。例如, newdict = dict.fromkeys(range(10), [])newdict = dict.fromkeys(range(10), list()) 两者都产生相同的数据结构,即带有相同列表作为值对的字典。因此,当更新任何键时,例如 newdict [0] .append(100),相应的print newdict输出如下: {0: [100], 1: [100], 2: [100], 3: [100], 4: [100], 5: [100], 6: [100], 7: [100], 8: [100], 9: [100]} 有没有办法避免这种情况而不必在for循环中迭代?提前感谢。

3
小问题:你的意思是 newdict[0].append(100) 或者 newdict[0] += [100],而不是 newdict[0] = 100 - DSM
我在3.3.3版本中没有遇到这种行为:newdict[0]=100会得到{0: 100, 1: [], 2: [], 3: [], 4: [], 5: [], 6: [], 7: [], 8: [], 9: []}... - MattDMo
@DSM - 是的,谢谢,我已经纠正了。 - paulski
4个回答

5

最常用的两种方法是使用字典推导式:

>>> d = {k: [] for k in range(10)}
>>> d[3].append(100)
>>> d
{0: [], 1: [], 2: [], 3: [100], 4: [], 5: [], 6: [], 7: [], 8: [], 9: []}

或者使用defaultdict而完全不设置任何键:
>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> d
defaultdict(<type 'list'>, {})
>>> d[9].append(100)
>>> d
defaultdict(<type 'list'>, {9: [100]})

作为第三个选项,可以使用setdefault--例如d.setdefault(k, [])而不是d[k],就像在defaultdict情况下一样,这样你就可以避免需要预设[]
>>> d = {}
>>> d.setdefault(3, []).append(100)
>>> d
{3: [100]}

4
也许是字典推导式?
newdict = {x: [] for x in range(10)}

他不想使用 for 循环。 - thefourtheye
4
我不太确定是否应将推导式视为循环。 - Xymostech
如果问题中的“无需通过for循环进行迭代”有任何含义... - thefourtheye
1
我也不认为字典推导式和for循环是一样的。感谢您的回答。 - paulski

0

我认为你想要做的是

newdict[0].append(100)

对吧?


0

fromkeysdict 类的一个静态方法。默认行为旨在将一组字典键设置为一个单一值,例如设置多集合计数器:

>>> d={}.fromkeys('abc',0)
>>> d
{'a': 0, 'c': 0, 'b': 0}
>>> d['a']+=1
>>> d
{'a': 1, 'c': 0, 'b': 0}

你可以将其修补以调用每个元素的函数:

>>> class FixFromKeys(dict):
...     def fromkeys(cls, seq, func):
...         return {key:func() for key in seq}
... 
>>> d=FixFromKeys().fromkeys([1,2,3],list)
>>> d[1].append(1)
>>> d
{1: [1], 2: [], 3: []}

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