我试图在内部列表中使用外部列表理解的值:
[ x for x in range(y) for y in range(3) ]
但不幸的是,这引发了一个NameError,因为名称y
未知(尽管外部列表理解指定了它)。
这是Python的限制(尝试过2.7.3和3.2.3)还是有充分的理由说明为什么这不起作用?
是否有计划摆脱限制?
是否有解决方法(一些不同的语法,我可能没想到)来实现我想要的目标?
答案 0 :(得分:15)
您正在讨论列表 comprehensions ,而不是生成器表达式。
您需要交换for循环:
[ x for y in range(3) for x in range(y) ]
您需要阅读这些内容,就像它们嵌套在常规循环中一样:
for y in range(3):
for x in range(y):
x
具有多个循环的列表推导遵循相同的顺序。请参阅list comprehension documentation:
提供列表推导时,它包含一个表达式,后跟至少一个
for
子句和零个或多个for
或if
子句。在这种情况下,新列表的元素是通过将每个for
或if
子句视为一个块,从左到右嵌套,并评估表达式以生成列表而生成的元素。每次到达最里面的块时都会元素。
当然,生成器表达式也是如此,但它们使用()
括号而不是方括号,并且不会立即实现:
>>> (x for y in range(3) for x in range(y))
<generator object <genexpr> at 0x100b50410>
>>> [x for y in range(3) for x in range(y)]
[0, 0, 1]
答案 1 :(得分:1)
你有没有尝试过:
[x for y in range(3) for x in range(y)]
因为它会产生一个输出...这会产生:
[0, 0, 1]
你想要的可能是也可能不是......
答案 2 :(得分:0)
只是嵌套另一代。
[ x for x in [range(y) for y in range(3) ]]
给了我:
[[], [0], [0, 1]]