首页 文章

了解使用嵌套循环创建2D列表

提问于
浏览 1261
2

嵌套for循环(在本例中为double for循环)如何在创建2D列表时起作用 .

例如,我希望有一个2x2矩阵,每个元素初始化为0 .

我懂了:

x = [[0 for i in range(row)] for j in range(col)]

其中row被定义为矩阵中的行数,col被定义为矩阵中的列数 . 在这种情况下,row = 2和col = 2 .

当我们打印x:

print(x)

我们将得到:

[[0, 0], [0, 0]]

这就是我们想要的 .

这背后的逻辑是什么?是 [0 for i in range(row)] 说,对于指定行号范围内的每个元素,我们将分配一个0来有效地创建矩阵中的第一行吗?

然后 for j in range(col) 说我们根据指定的列号重复创建这个列表,以有效地创建更多的行,最终成为列?

我该如何从左到右阅读此代码段?

3 回答

  • 2

    这只是一个捷径:

    x = []
    for j in range(column):
        _ = []
        for i in range(row):
            _.append(i)
        x.append(_)
    

    你可以把内部 for 循环写成一个,说该列表由一大堆 0 组成 . 我们为 range(row) 中的每个 i 执行此操作,因此我们可以说 _ = [0 for i in range(row)] . 这是看起来如何:

    x = []
    for j in range(column):
        x.append([0 for i in range(row)])
    

    我们现在可以看到 x 由一堆 [0 for i in range(row)] 组成,我们为 range(column) 中的每个 j 做了一次,所以我们可以将它简化为:

    x = [[0 for i in range(row)] for j in range(column)]
    
  • 1

    关于这段代码如何工作的假设是正确的:内部列表理解创建了一个零列表,外部列表理解创建了这样的列表列表 . 然后,您只需将列表解释为列,将每个列表中某个位置的零解释为行 . (没有涉及矩阵的数学概念,因此没有将行转换为列;它只是列表列表 . )

    用于创建零和列表的代码实际上被执行多次,从而产生不同的列表(即,您可以修改其中一个而不修改其他列表) . 我正在强调这一点,因为你是Python新手,所以注意对象身份和对象平等之类的东西是很重要的 . 例如,零列表可以这样做:

    [0] * row
    

    这样就行了,因为列表保存了对整数 0 的引用,修改列表会替换一些引用并保留其他引用 . 另一方面,以下代码会做出与您不同的代码:

    [[0] * row] * col
    

    结果看起来与你的第一眼看上去相同,但是外部列表现在会对同一个零列表进行多次引用,因此修改一列也会修改其他列(因为所有列现在都是相同的列表,不是明显的内容相同的清单) .

    此外,它's interesting to consider the functional nature of list comprehensions. You'重新询问如何阅读代码:只是阅读它'd read it out aloud. What I'我得到的是这个代码不是程序性的,它没有规定机器应该如何创建空列表并向它们添加元素 . 它改为描述结果应该是什么:列表中每个位置的零列表,它们的编号为 row ,以及另一个列表中每个位置的此类列表的列表,它们的编号依次为 col .

  • 0

    有时扩展所有单线速记代码可以帮助您更好地理解:

    基本

    x = [i for i in range(somelist)]
    

    可以扩展为:

    x = []
    for i in range(somelist):
        x.append(i)
    

    更多嵌套

    x = [[0 for i in range(row)] for j in range(col)]
    

    可以扩展为:

    x = []
    for j in range(col):
        _ = []
        for i in range(row):
            _.append(0)
        x.append(_)
    

相关问题