Python 创建列表词典的速记方法?

Python 创建列表词典的速记方法?,python,python-2.7,Python,Python 2.7,我有一个键列表,希望创建一个字典,如下所示: d = {"a":[] ,"b":[] ,"c":[] ,"d":[]} 如果我尝试这样的方法: keys = ['a','b','c','d'] d = dict(zip(keys,[[]]*len(keys))) 它创建字典很好,只是所有列表都是对同一个对象的引用,所以如果我尝试d['c'].append('one'),它就会被追加到所有四个列表中 我用听写理解法解决了这个问题 (对于那些感兴趣的人:d={k:[]对于键中的k}),但是想知道

我有一个键列表,希望创建一个字典,如下所示:

d = {"a":[] ,"b":[] ,"c":[] ,"d":[]}
如果我尝试这样的方法:

keys = ['a','b','c','d']
d = dict(zip(keys,[[]]*len(keys)))
它创建字典很好,只是所有列表都是对同一个对象的引用,所以如果我尝试
d['c'].append('one')
,它就会被追加到所有四个列表中

我用听写理解法解决了这个问题 (对于那些感兴趣的人:
d={k:[]对于键中的k}
),但是想知道是否有更有效的方法


编辑:是的,我知道这是听写理解。这显然是一个拼写错误。

听写理解是相当有效的(而且它不是您提到的列表理解)。我建议用听写理解法。当然,实现这一目标的替代方案很少,但它们不会像你提到的那样高效

下面是您使用
zip
的替代解决方案(尽管我知道它的工作方式与您期望的不一样)与在Python 2.7上使用dict比较的
timeit
比较:

# 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迭代

keys = ['a','b','c','d']
d = dict((k,[]) for k in keys)
d['c'].append('one')
print(d)
你得到

{'c': ['one'], 'a': [], 'b': [], 'd': []}

列表理解非常有效……这是一种dict理解,而不是列表理解,这是实现这一点的标准方法。这可以工作,具体取决于用例,但如果您尝试在测试中执行
,或者访问不在
列表中的键,行为会有所不同。
{'c': ['one'], 'a': [], 'b': [], 'd': []}