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

时间:2016-02-16 15:51:45

标签: python list matrix

嵌套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 个答案:

答案 0 :(得分:3)

这只是一个捷径:

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

你可以将内部for循环放到一个,说明列表由一大堆0组成。我们为i中的每个range(row)执行此操作,因此我们可以说_ = [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)]组成,我们为j中的每个range(column)执行一次,因此我们可以简化对此:

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

答案 1 :(得分:1)

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

基本

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

答案 2 :(得分:0)

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

用于创建零和列表的代码实际上是多次执行的,从而产生不同的列表(即,您可以修改其中一个而不修改其他列表)。我强调这一点,因为你是Python的新手,关注对象身份和对象平等等事情是非常重要的。例如,零列表可以这样做:

[0] * row

这可以,因为列表保存对整数0的引用,修改列表将替换某些引用并保留其他引用。另一方面,以下代码会做与您不同的代码:

[[0] * row] * col

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

此外,考虑列表推导的功能性也很有趣。您正在询问如何阅读代码:只需在您大声朗读时阅读即可。我所得到的是,这段代码不是程序性的,它没有规定机器应该如何创建空列表并向其添加元素。它改为描述结果应该是什么:列表中每个位置的零列表,它们的编号为row,以及另一个列表中每个位置的列表,它们的编号依次为{{1 }}