创建不同列表的空白列表的字典

时间:2013-12-21 04:38:06

标签: python list dictionary copy

我正在尝试创建一个可以附加到for循环中的列表的dict。但是,如果我使用fromkeys创建一个dict,该列表将成为“指针”的副本,而不是新列表。例如,

newdict = dict.fromkeys(range(10), [])

- 或 -

newdict = dict.fromkeys(range(10), list())

两者都产生相同的数据结构,一个带有SAME列表的dict作为值对。这样当任何密钥更新时,例如 - 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循环中进行迭代的任何想法?提前谢谢。

4 个答案:

答案 0 :(得分: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]}

答案 1 :(得分:4)

也许是一个词典理解?

newdict = {x: [] for x in range(10)}

答案 2 :(得分:0)

我想你想做

newdict[0].append(100)

正确?

答案 3 :(得分: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: []}