Python嵌套字典推导式

3

有人能解释一下如何进行嵌套字典推导吗?

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

I would have liked:

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

谢谢!

4个回答

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

太好了,我很高兴这可以简化。 - atp

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}
>>> 

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)}

1
问题中的额外括号引入了另一个生成器表达式,它产生2个生成器,每个生成器产生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}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接