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