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]
预期结果:
这是有效的方法
1 2 3 | data = {0:[],1:[]} data[1].append('hello') print data |
实际和预期结果:
为什么
将
在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 |
将输出
您正在用对单个列表的引用填充字典,因此当您更新它时,更新会反映在所有引用中。试试字典的理解。见在python中创建具有列表理解功能的字典
1 | d = {k : v for k in blah blah blah} |
你可以用这个:
1 | data[:1] = ['hello'] |