嵌套列表推导如何在python中工作?

时间:2014-09-26 15:17:29

标签: python list

我试图通过解构它来理解列表理解。 假设我将矩阵定义为列表列表。 (是的,我知道numpy这不是以一种简单有效的方式做到这一点。这是关于理解。) 和标量

A = [[1, 2, 3],
     [2, 3, 6],
     [3, 4, 12]]

s = 7

正如我在别处发现的那样,我可以定义一个列表推导来执行标量乘法。

def ScalarMult(A,s):
    return [[s*i for i in row] for row in A]

As = ScalarMult(A,s)
print('As = ', As)

然后返回

As = [[7,14,14],[14,21,42],[21,28,84]]

嵌套列表,这就是我想要的但这是如何工作的?

如果我写

def ScalarMult(A,s):
    As = []
    for row in A:
        for i in row:
            As.append(s*i)
    return As

返回

As = [7,14,14,14,21,42,21,28,84]

一个扁平的列表,这不是我想要的。 我该怎么写

对于A中的行,

[[s * i for i in row]

作为嵌套for循环并让它返回一个嵌套列表,并清楚地看到它对这个3X3矩阵做了什么?当然,我想定义一个函数,例如ScalarMult,它适用于任何大小的矩阵。

1 个答案:

答案 0 :(得分:4)

您可以这样写:

def ScalarMult(A,s):
    As = []
    for row in A:
        Arow = []
        for i in row:
            Arow.append(s*i)
        As.append(Arow)
    return As

更进一步说明:

def ScalarMult(A,s):
    As = []
    for row in A:
        As.append([s*i for i in row])
    return As

进一步提出两个步骤:

def ScalarMult(A,s):
    As = [[s*i for i in row] for row in A]
    return As

(即你的开始。)

希望这会让事情更加清晰。