Python 嵌套字典理解

发布于 2024-10-11 05:57:10 字数 267 浏览 2 评论 0原文

有人可以解释如何进行嵌套字典理解吗?

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

谢谢!

Can someone explain how to do nested dict comprehensions?

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

Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

水波映月 2024-10-18 05:57:10
dict((x+y,0) for x in 'cd' for y in 'ab')
dict((x+y,0) for x in 'cd' for y in 'ab')
但可醉心 2024-10-18 05:57:10

您可以使用 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}
>>> 

You can simplify this to a single loop by using the cartesian product from 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}
>>> 
ぃ弥猫深巷。 2024-10-18 05:57:10
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)}
dict((x+2*y, 0) for x in range(1,4,2) for y in range(15, 18, 2))

BTW, what we call dict comprehension is something like the following which is only available in Python2.7+:

{x+2*y:0 for x in range(1,4,2) for y in range(15, 18, 2)}
菩提树下叶撕阳。 2024-10-18 05:57:10

问题中额外的括号引入了另一个生成器表达式,该表达式生成 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 及更高版本中,您可以使用 dict 理解

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

The extra parentheses in the question introduce another generator expression that yields 2 generators each yielding 2 tuples. The list comprehension below shows exactly what is happening.

>>> [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>]

A list comprehension instead of the generator expression shows what the generators above contain

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

And that is why you were getting two key-value of pairs of tuples.

Why mouad's answer works

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

In Python 2.7 and 3.0 and above, you can use dict comprehensions

>>> j = {x+y:0 for x in 'cd' for y in 'ab'}
>>> j
{'cb': 0, 'ca': 0, 'db': 0, 'da': 0}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文