我有一个键列表,想要创建一个如下所示的字典:
d = {"a":[] ,"b":[] ,"c":[] ,"d":[]}
如果我尝试这样的事情:
keys = ['a','b','c','d']
d = dict(zip(keys,[[]]*len(keys)))
它创建了很好的字典,除了所有列表都是对同一个对象的引用,所以如果我尝试d['c'].append('one')
,它会被附加到所有四个列表。
我用dict理解解决了它
(对于那些感兴趣的人:d = {k : [] for k in keys}
)但是想知道是否有更有效的方式?
编辑:是的,我知道这是一个词典理解。那显然是一个错字。
答案 0 :(得分:4)
from collections import defaultdict
data = defaultdict(list)
data['key'].append('a')
data['key'] # prints ['a']
这样你就可以直接跳过dict迭代了。
答案 1 :(得分:3)
Dict理解非常有效(而且不是你提到的 list comprehension )。我建议去理解dict。当然,实现这一目标的方法很少,但它们不会像你提到的那样有效。
以下是使用timeit
进行替代解决方案的zip
比较(尽管我知道它不会按预期方式运行)和使用 dict比较< / em> on Python 2.7:
# Using dict comprehension --> 0.415 usec
mquadri$ python -m "timeit" -s "keys=keys = ['a','b','c','d']" "{key: [] for key in keys}"
1000000 loops, best of 3: 0.415 usec per loop
# Using `dict`-`zip` conversion --> 1.48 usec
mquadri$ python -m "timeit" -s "keys=keys = ['a','b','c','d']" "dict(zip(keys,[[]]*len(keys)))"
1000000 loops, best of 3: 1.48 usec per loop
正如您所看到的, dict理解方法的速度快了三倍,我怀疑还有其他更有效的方法来实现这一目标。
答案 2 :(得分:0)
keys = ['a','b','c','d']
d = dict((k,[]) for k in keys)
d['c'].append('one')
print(d)
你得到了
{'c': ['one'], 'a': [], 'b': [], 'd': []}