嵌套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)
说我们根据指定的列号重复创建此列表,以有效地创建更多行,最终成为列?
我应该如何从左到右阅读此代码段?
答案 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 }}