如何在python中初始化空列表的字典?

How do I initialize a dictionary of empty lists in Python?

我试图以编程方式创建一个列表字典,但未能允许我单独处理字典键。每当我创建列表字典并尝试附加到一个键时,所有列表都会更新。下面是一个非常简单的测试用例:

1
2
3
4
data = {}
data = data.fromkeys(range(2),[])
data[1].append('hello')
print data

实际结果:EDOCX1[0]

预期结果:{0: [], 1: ['hello']}

这是有效的方法

1
2
3
data = {0:[],1:[]}
data[1].append('hello')
print data

实际和预期结果:{0: [], 1: ['hello']}

为什么fromkeys方法不能按预期工作?


[]作为第二个参数传递给dict.fromkeys()会得到一个相当无用的结果——字典中的所有值都将是同一个列表对象。

在python 2.7或更高版本中,您可以使用dicitonary理解来代替:

1
data = {k: [] for k in range(2)}

在早期版本的python中,可以使用

1
data = dict((k, []) for k in range(2))


改为使用defaultdict:

1
2
3
from collections import defaultdict
data = defaultdict(list)
data[1].append('hello')

这样就不必预先初始化所有要用于列表的键。

您的示例中所发生的是使用一个(可变)列表:

1
2
3
4
alist = [1]
data = dict.fromkeys(range(2), alist)
alist.append(2)
print data

将输出{0: [1, 2], 1: [1, 2]}


您正在用对单个列表的引用填充字典,因此当您更新它时,更新会反映在所有引用中。试试字典的理解。见在python中创建具有列表理解功能的字典

1
d = {k : v for k in blah blah blah}


你可以用这个:

1
data[:1] = ['hello']