嵌套列表推导

时间:2012-08-13 12:41:22

标签: python list syntax list-comprehension

我试图在内部列表中使用外部列表理解的值:

[ x for x in range(y) for y in range(3) ]

但不幸的是,这引发了一个NameError,因为名称y未知(尽管外部列表理解指定了它)。

这是Python的限制(尝试过2.7.3和3.2.3)还是有充分的理由说明为什么这不起作用?

是否有计划摆脱限制?

是否有解决方法(一些不同的语法,我可能没想到)来实现我想要的目标?

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子句和零个或多个forif子句。在这种情况下,新列表的元素是通过将每个forif子句视为一个块,从左到右嵌套,并评估表达式以生成列表而生成的元素。每次到达最里面的块时都会元素。

当然,生成器表达式也是如此,但它们使用()括号而不是方括号,并且不会立即实现:

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