从iterable创建字典并为其分配一些默认值的最简单方法是什么?我试过了:
>>> x = dict(zip(range(0, 10), range(0)))
但这不起作用,因为范围(0)不是可迭代的,因为我认为它不会(但我还是试过了!)
那我该怎么做呢?如果我这样做:
>>> x = dict(zip(range(0, 10), 0))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: zip argument #2 must support iteration
这也不起作用。有什么建议吗?
答案 0 :(得分:18)
在python 3中,你可以使用dict理解。
>>> {i:0 for i in range(0,10)}
{0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0}
幸运的是,这已经在python 2.7中向后移植,因此也可以在那里使用。
答案 1 :(得分:16)
您需要dict.fromkeys
方法,它完全符合您的要求。
来自文档:
fromkeys(...)
dict.fromkeys(S[,v]) -> New dict with keys from S and values equal to v.
v defaults to None.
所以你需要的是:
>>> x = dict.fromkeys(range(0, 10), 0)
>>> x
{0: 0, 1: 0, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0}
答案 2 :(得分:2)
PulpFiction提供了实用的方法。但只是为了兴趣,您可以使用itertools.repeat
重复0来使解决方案正常工作。
x = dict(zip(range(0, 10), itertools.repeat(0)))
答案 3 :(得分:1)
您可能需要考虑使用标准库的defaultdict
模块中的collections
子类。通过使用它,您甚至可能不需要迭代迭代,因为只要您第一次访问它们,就会创建与指定默认值关联的键。
在下面的示例代码中,我插入了一个免费的for
循环来强制创建它们中的一些,以便下面的print语句可以显示。
from collections import defaultdict
dflt_dict = defaultdict(lambda:42)
# depending on what you're doing this might not be necessary...
for k in xrange(0,10):
dflt_dict[k] # accessing any key adds it with the specified default value
print dflt_dict.items()
# [(0, 42), (1, 42), (2, 42), (3, 42), ... (6, 42), (7, 42), (8, 42), (9, 42)]