使用内置的dict()从元组列表生成一个dict

时间:2014-02-06 21:39:01

标签: python dictionary

我很惊讶以下代码块中的两个示例都返回相同的值。 dict()内置如何接受第二种语法(不是生成器表达式的语法)?这是由解析器处理的吗?

>>> words = ['cat','dog','frog']
>>> dict([(word, True) for word in words])
{'dog': True, 'frog': True, 'cat': True}
>>> dict((word, True) for word in words)
{'dog': True, 'frog': True, 'cat': True}

2 个答案:

答案 0 :(得分:3)

第二种语法实际上是生成器表达式。

PEP-289。它甚至包括以下示例:

d = dict( (k, func(k)) for k in keylist)

这几乎就是你所拥有的。

第一种语法是list comprehension,有点类似但不同的构造。

应用于您的示例的一个关键区别是第一个版本创建并丢弃临时列表,而第二个版本则不会。

答案 1 :(得分:2)

这两个例子都是 iterables ,所以你可以用同样的方式“长手”写它:

Generator

generator_construct = ((word, True) for word in words)
d = {}
for key, value in generator_construct:
    d[key] = value

List comprehension

list_construct = [(word, True) for word in words]
d = {}
for key, value in list_construct:
    d[key] = value

两者都可以以相同的方式迭代。唯一的区别是list comprehension构建一个真实的列表,并且生成器一次产生一个值。对于大量项目,由于额外的存储空间,列表理解会有更多的开销。

@JonClements评论的第三个选项:

d = dict.fromkeys(words, True)

在这两者中,它最接近生成器,因为它不构建键/值列表,但它直接在words iterable上工作。