如何创建只填充对角线的嵌套列表(矩阵)



这是一个矩阵填充程序。如何只填充对角线并使其他元素都为零?

期望输出

[[1, 0, 0, 0, 0],
[0, 4, 0, 0, 0],
[0, 0, 9, 0, 0],
[0, 0, 0, 16, 0],
[0, 0, 0, 0, 25]]

电流输出(包装以便于阅读(

[[0, 0, 0, 0, 0],
[1, 1, 1, 1, 1],
[4, 4, 4, 4, 4],
[9, 9, 9, 9, 9],
[16, 16, 16, 16, 16]]
multiarray = []
for i in range(5):
multiarray.append([])
for j in range(5):
multiarray[i].append(i**2)
print(multiarray)

您只需要一个循环,因为它们只有一个特定的值要设置,并且它的位置由i给定,您还需要i+1而不是i的功率

size = 5
multiarray = []
for i in range(size):
multiarray.append([0] * size)
multiarray[i][i] = (i + 1) ** 2
for i in range(5):
multiarray.append([0]*5)
multiarray[i][i] = (i+1)**2
multiarray = [[i**2*(i==j) for i in range(1,6)] for j in range(1,6)]
print(multiarray)

打印:

[[1, 0, 0, 0, 0], [0, 4, 0, 0, 0], [0, 0, 9, 0, 0], [0, 0, 0, 16, 0], [0, 0, 0, 0, 25]]

您的问题是multiarray[i].append(i**2)。这样做的目的是将i**2附加到列表j次。换句话说,您正在用i**2重复j次来填充一个空列表。

这里有一个替代解决方案,因为其他方法已经充分涵盖了其他方法:

In [1]: n = 5
In [2]: [[0]*i + [(i + 1)**2] + [0]*(n - i - 1) for i in range(n)]
Out[2]:
[[1, 0, 0, 0, 0],
[0, 4, 0, 0, 0],
[0, 0, 9, 0, 0],
[0, 0, 0, 16, 0],
[0, 0, 0, 0, 25]]

为了解释,我使用列表重复运算符*和列表串联运算符+来左右填充每行特定数量的零。以下是该表达式的每个"术语"在串联之前的样子:

In [3]: for i in range(n):
...:     print([0]*i, [(i + 1)**2], [0]*(n - i - 1))
...:
[] [1] [0, 0, 0, 0]
[0] [4] [0, 0, 0]
[0, 0] [9] [0, 0]
[0, 0, 0] [16] [0]
[0, 0, 0, 0] [25] []

最新更新