2014-02-06 69 views
0

我很惊讶,下面的代码块中的两个示例都返回相同的值。 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} 
+1

第二个语法_is_ a [generator expression](http://www.python.org/dev/peps/pep-0289/)。第一个是[列表理解](http://docs.python.org/2/tutorial/datastructures.html#list-comprehensions)。 – iCodez

+0

感谢您纠正我的错误! –

回答

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 

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

通过@JonClements的评论给出的第三个选项:

d = dict.fromkeys(words, True) 

在这两个,这是最接近它不建立一个键/值列表中的发电机,但它直接在words可迭代。

+0

在OP的问题中,对于非可变值,可能值得添加最好的方法是:'dict.fromkeys(words,True)' –

+0

非常清晰的描述。感谢您为我清理它。 –

2

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

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

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

这几乎就是你所拥有的。

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

适用于您的示例的一个主要区别是第一个版本创建并放弃临时列表,而第二个版本不会。