2011-01-09 57 views
3

有人可以解释如何做嵌套的词典理解?Python嵌套的词典理解

>> j = dict(((x+y,0) for x in 'cd') for y in 'ab') 
>> {('ca', 0): ('da', 0), ('cb', 0): ('db', 0)} 

我也喜欢:

>> j 
>> {'ca':0, 'cb':0, 'da':0, 'db':0} 

谢谢!

回答

8
dict((x+y,0) for x in 'cd' for y in 'ab') 
+0

太好了,我很高兴,这可以简化。 – ash 2011-01-09 11:46:34

1
dict((x+2*y, 0) for x in range(1,4,2) for y in range(15, 18, 2)) 

顺便说一句,就是我们所说的字典理解是像下面这是只有在Python2.7 +可供选择:通过使用

{x+2*y:0 for x in range(1,4,2) for y in range(15, 18, 2)} 
4

您可以简化这个单环流从itertools笛卡尔乘积

>>> from itertools import product 
>>> j=dict((x+y,0) for x,y in product('cd','ab')) 
>>> j 
{'cb': 0, 'ca': 0, 'db': 0, 'da': 0} 
>>> 
+0

非常酷的图书馆。我将来必须使用它。 – ash 2011-01-09 23:04:33

1

在讨论的额外的括号介绍另一个发生器表达式收率每个发生器产生2个元组。下面的列表理解显示了正在发生的事情。

>>> [w for w in (((x+y,0) for x in 'cd') for y in 'ab')] 
[<generator object <genexpr> at 0x1ca5d70>, <generator object <genexpr> at 0x1ca5b90>] 

列表理解,而不是生成器表达式显示了上述发电机包含

>>> [w for w in ([(x+y,0) for x in 'cd'] for y in 'ab')] 
[[('ca', 0), ('da', 0)], [('cb', 0), ('db', 0)]] 

这就是为什么你越来越对元组的两个键值。

为什么mouad的回答工作

>>> [w for w in ((x+y,0) for x in 'cd' for y in 'ab')] 
[('ca', 0), ('cb', 0), ('da', 0), ('db', 0)] 

在Python 2.7和3.0及以上版本,你可以使用字典内涵

>>> j = {x+y:0 for x in 'cd' for y in 'ab'} 
>>> j 
{'cb': 0, 'ca': 0, 'db': 0, 'da': 0}