【问题标题】:Understanding creating a 2D list with nested loops了解使用嵌套循环创建二维列表
【发布时间】:2016-05-27 23:54:11
【问题描述】:

嵌套的 for 循环(在本例中为双 for 循环)如何创建二维列表。

例如,我想要一个 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)是说我们根据指定的列号重复创建这个列表以有效地创建更多的行,最终成为列?

我应该如何从左到右阅读这段代码 sn-p?

【问题讨论】:

标签: python list matrix


【解决方案1】:

您对这段代码如何工作的假设是正确的:内部列表推导创建一个零列表,而外部列表推导创建一个此类列表的列表。然后,您只需将列表解释为列,并将每个列表中某个位置的零解释为行。 (没有涉及矩阵的数学概念,所以没有将行变成列;它只是一个列表的列表。)

用于创建零和列表的代码实际上会执行多次,从而产生不同的列表(即您可以修改其中一个而不修改其他列表)。我之所以强调这一点,是因为由于您是 Python 新手,因此注意对象标识与对象相等之类的事情很重要。例如,零列表可以这样完成:

[0] * row

这没关系,因为列表包含对整数 0 的引用,并且修改列表将替换一些引用并保持其他引用不变。另一方面,下面的代码会做一些与你不同的事情:

[[0] * row] * col

乍一看,结果与您的结果相同,但外部列表现在包含对同一个零列表的多个引用,因此修改一个列也会修改其他列(因为所有列现在都是同一个列表,而不是相同内容的不同列表)。

此外,考虑列表推导的功能性质也很有趣。您在问如何阅读代码:只需像大声朗读一样阅读即可。我的意思是这段代码不是程序性的,它没有规定机器应该如何创建空列表并向它们添加元素。相反,它描述了结果应该是什么:列表中每个位置的零列表,它们的编号为row,以及另一个列表中每个位置的此类列表的列表,它们的编号依次为col

【讨论】:

  • 谢谢!这有助于我更多地理解如何解释这些列表,特别是如果我想在列表中创建列表(在我的示例中是 2D 列表)。还要感谢您提供的参考提示,因为更改一件事可能会无意中更改另一件事。
【解决方案2】:

有时扩展所有单行简写代码可以帮助你更好地理解:

基本

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(_)

【讨论】:

  • LOL,我的示例变量命名与@zondo 完全相同。我们使用的是多么标准的约定。 :) _ 只是一个临时变量名,以防有人混淆。
  • 您好,感谢您的回复。所以只是为了确保阅读这个嵌套 for 循环的扩展版本,我应该从右到左而不是从左到右阅读列表理解版本吗?因为在扩展版本中,我们从涉及 j 的外部 for 循环开始,然后是涉及 i 的 for 循环,它嵌套在其中。
  • 是的,从外循环开始。但你必须小心。特别是在以下代码上是不一样的:[i for i in range(row) for j in range(col)] vs [[for i in range(row)] for j in range(col)])。注意这 2 个的区别,如果您对这 2 个感到好奇,请在另一个线程上询问。;)
【解决方案3】:

这只是一个捷径:

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

【讨论】:

    猜你喜欢
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2018-01-06
    • 2013-12-14
    • 1970-01-01
    • 2011-04-07
    相关资源
    最近更新 更多