创建列表字典的简写?

时间:2017-02-10 21:44:31

标签: python python-2.7

我有一个键列表,想要创建一个如下所示的字典:

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})但是想知道是否有更有效的方式?

编辑:是的,我知道这是一个词典理解。那显然是一个错字。

3 个答案:

答案 0 :(得分:4)

defaultdict

怎么样?
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': []}