gpt4 book ai didi

python - 高级嵌套列表理解语法

转载 作者:IT老高 更新时间:2023-10-28 21:33:29 27 4
gpt4 key购买 nike

我正在玩弄列表推导以更好地理解它们,但我遇到了一些我无法解释的意外输出。我之前没有发现这个问题被问过,但如果它/是/重复的问题,我很抱歉。

我本质上是在尝试编写一个生成器的生成器。一个使用列表推导的简单生成器如下所示:

(x for x in range(10) if x%2==0) # generates all even integers in range(10)

我试图做的是编写一个生成器,它生成两个生成器——第一个生成范围 (10) 中的偶数,第二个生成范围 (10) 中的奇数。为此,我做了:

>>> (x for x in range(10) if x%2==i for i in range(2))
<generator object <genexpr> at 0x7f6b90948f00>

>>> for i in g.next(): print i
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <genexpr>
UnboundLocalError: local variable 'i' referenced before assignment
>>> g.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> g = (x for x in range(10) if x%2==i for i in range(2))
>>> g
<generator object <genexpr> at 0x7f6b90969730>
>>> g.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <genexpr>
UnboundLocalError: local variable 'i' referenced before assignment

我不明白为什么在分配之前引用了“i”

我认为这可能与 i in range(2) 有关,所以我做了:

>>> g = (x for x in range(10) if x%2==i for i in [0.1])
>>> g
<generator object <genexpr> at 0x7f6b90948f00>
>>> g.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <genexpr>
UnboundLocalError: local variable 'i' referenced before assignment

这对我来说没有意义,所以我认为最好先尝试一些更简单的东西。所以我回到列表并尝试:

>>> [x for x in range(10) if x%2==i for i in range(2)]
[1, 1, 3, 3, 5, 5, 7, 7, 9, 9]

我希望与以下内容相同:

>>> l = []
>>> for i in range(2):
... for x in range(10):
... if x%2==i:
... l.append(x)
...
>>> l
[0, 2, 4, 6, 8, 1, 3, 5, 7, 9] # so where is my list comprehension malformed?

但是当我凭直觉尝试时,它奏效了:

>>> [[x for x in range(10) if x%2==i] for i in range(2)]
[[0, 2, 4, 6, 8], [1, 3, 5, 7, 9]] # so nested lists in nested list comprehension somehow affect the scope of if statements? :S

所以我认为这可能是 if 语句运行的范围级别的问题。所以我尝试了这个:

>>> [x for x in range(10) for i in range(2) if x%2==i]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

现在我完全糊涂了。有人可以解释这种行为。我不明白为什么我的列表推导似乎格式不正确,也不明白 if 语句的范围如何工作。

PS:在校对问题时,我意识到这看起来确实有点像家庭作业问题 - 它不是。

最佳答案

你需要使用一些括号:

((x for x in range(10) if x%2==i) for i in range(2))

This didn't make sense to me, so I thought it best to try something simpler first. So I went back to lists and tried:

[>>> [x for x in range(10) if x%2==i for i in range(2)] [1, 1, 3, 3, 5, 5, 7, 7, 9, 9]

这很有效,因为之前的列表解析将 i 变量泄漏到封闭范围,并成为当前变量的 i。尝试启动一个新的 python 解释器,这会由于 NameError 而失败。计数器的泄漏行为已在 Python 3 中移除。

编辑:

等价的for循环:

(x for x in range(10) if x%2==i for i in range(2))

应该是:

l = []
for x in range(10):
if x%2 == i:
for i in range(2):
l.append(x)

这也会导致名称错误。

EDIT2:

括号内的版本:

((x for x in range(10) if x%2==i) for i in range(2))

相当于:

li = []
for i in range(2):
lx = []
for x in range(10):
if x%2==i:
lx.append(x)
li.append(lx)

关于python - 高级嵌套列表理解语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3766711/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com