我尝试以编程方式创建列表字典,但我无法单独处理字典键。每当我创建列表字典并尝试附加到一个键时,所有这些都会更新。这是一个非常简单的测试用例:
data = {}
data = data.fromkeys(range(2),[])
data[1].append('hello')
print data
实际结果:{0: ['hello'], 1: ['hello']}
预期结果:{0: [], 1: ['hello']}
这是有效的
data = {0:[],1:[]}
data[1].append('hello')
print data
实际和预期结果:{0: [], 1: ['hello']}
为什么fromkeys
方法无法按预期工作?
答案 0 :(得分:86)
将[]
作为第二个参数传递给dict.fromkeys()
会产生相当无用的结果 - 字典中的所有值都将是相同的列表对象。
在Python 2.7或更高版本中,您可以使用dicitonary comprehension:
data = {k: [] for k in range(2)}
在早期版本的Python中,您可以使用
data = dict((k, []) for k in range(2))
答案 1 :(得分:64)
改为使用defaultdict:
from collections import defaultdict
data = defaultdict(list)
data[1].append('hello')
这样您就不必事先将要用于列表的所有键初始化。
您的示例中发生的是您使用一个(可变)列表:
alist = [1]
data = dict.fromkeys(range(2), alist)
alist.append(2)
print data
会输出{0: [1, 2], 1: [1, 2]}
。
答案 2 :(得分:6)
您正在使用对单个列表的引用来填充字典,因此在更新它时,更新将反映在所有引用中。请尝试字典理解。看到 Create a dictionary with list comprehension in Python
d = {k : v for k in blah blah blah}
答案 3 :(得分:-3)
你可以用这个:
data[:1] = ['hello']