2014-02-06 71 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,它有點類似但是不同的構造。

適用於您的示例的一個主要區別是第一個版本創建並放棄臨時列表,而第二個版本不會。