从可迭代创建字典

时间:2010-11-03 06:43:51

标签: python dictionary

从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

这也不起作用。有什么建议吗?

4 个答案:

答案 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)]