这个Python列表理解以什么顺序执行?

时间:2016-04-06 02:01:56

标签: python list list-comprehension

我对这个列表理解感到有点困惑:

l = [[i * j for j in range(3, 5)] for i in range(3)]

执行的顺序是什么?

4 个答案:

答案 0 :(得分:3)

这是一个非常简单的列表理解形式:

[expression for var in iterable]

在这种情况下,expression恰好是另一个列表理解。因此,内部理解将对外部可迭代产生的每个项目进行一次评估。

如果我们将内心理解分解为一个函数,可能会感觉更清楚一点:

def inner(i):
    return [i * j for j in range(3, 5)]

l = [inner(i) for i in range(3)]

现在我们更清楚地看到(希望无论如何)外在理解导致内部理解为每个" i"执行一次。在range(3)

答案 1 :(得分:0)

想象一下,它是从外面执行的。

[X for i in range(3)]

在这种情况下,X本身就是另一个列表理解:

[i*j for j in range(3,5)]

其中i绑定到单个值。

因此它扩展为[[0*3,0*4],[1*3,1*4],[2*3,2*4]][[0,0],[3,4],[6,8]]

答案 2 :(得分:0)

以下内容:

l = [[i * j for j in range(3, 5)] for i in range(3)]

i接受值012。对于i的每个值,将评估嵌套列表推导并将结果保存到顶级列表:

[i * j for j in range(3, 5)]

此处,j采用值34。对于每个值,保存j与当前值i的乘积。

对于i的第一个值,即0,这是0值的j倍,因此您获得了[0, 0]

对于i的第二个值,即1,这是1值的j倍,因此您获得[3, 4]

对于i的第三个值,即2,这是2值的j倍,因此您获得[6, 8]

最终结果是由这三个子列表组成的列表,所以你得到:

[[0, 0], [3, 4], [6, 8]]

答案 3 :(得分:0)

l = [[i * j for j in range(3, 5)] for i in range(3)]

可以想象为:

 (1) l = [[i * j for j in range(3, 5)] with i = 0] => [[0*3, 0*4]]= [[0,0]]
+(2) l = [[i * j for j in range(3, 5)] with i = 1] =>[[0,0], [3,4]]
+(3) l = [[i * j for j in range(3, 5)] with i = 2] =>[[0,0], [3,4], [6,8]]