我有一个编码超过2个矩阵之和的赋值。我将它编码为2个矩阵并且它有效,但是当我为2个以上的矩阵编写相同的代码时,它不起作用。
这是2的代码:
def add_matrices(mat1,mat2):
new_mat=[]
m=0
while m<len(mat1):
c=[]
n=0
while n<len(mat1[0]):
c.append(mat1[m][n]+mat2[m][n])
n=n+1
m=m+1
new_mat.append(c)
return new_mat
这是超过2的代码:
def sum_matrices(mat_lst):
new_mat=[]
for l in mat_lst:
m=0
while m<len(l):
c=[]
n=0
while n<len(l[0]):
c.append(sum(l[m][n]))
n=n+1
m=m+1
new_mat.append(c)
return new_mat
当我尝试它时,它会回信:
c.append(sum(l[m][n]))
TypeError: 'int' object is not iterable
我该如何解决?
答案 0 :(得分:2)
这是因为sum
是列表的函数waitng作为参数,而不是整数:
sum(1)
Traceback (most recent call last):
File "python", line 1, in <module>
TypeError: 'int' object is not iterable
在您的第l[m][n]
行 - &gt;那可能是int
而不是list
:
sum(l[m])
将对位置m
中的列表求和小心,你不能这样做:
sum([[1,2,3], [1,2]])
Traceback (most recent call last):
File "python", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'list'
但你可以这样做:
sum([[1,2,3], [1,2]][0])
=> 6
答案 1 :(得分:1)
在你的代码中写道:
for l in mat_lst:
这意味着l
是您想要求和的特定矩阵。接下来,您会生成一些坐标m
和n
,然后编写sum(l[m][n])
。但l[m][n]
是矩阵的一个元素。因此,您在单个值上构建了sum(..)
。现在sum(3)
毫无意义(绝对不是你想要的)。
所以你必须以另一种方式进行处理。解决此问题的一种方法是首先迭代坐标对,然后在 all 矩阵中求和这些单元格。这意味着我们会写下这样的内容:
def sum_matrices(mat_lst):
new_mat = []
for m in range(len(mat_lst[0])):
row = []
for n in range(len(mat_lst[0][0])):
row.append(sum(mat[m][n] for mat in mat_list))
new_mat.append(row)
return new_mat
此代码的工作原理如下。我们首先初始化new_mat = []
:我们构造一个新的列表,它将成为结果。接下来,我们使用len(mat_list[0])
确定第一个矩阵的行数。然后我们将使用for m in range(..)
迭代所有行。因此m
将从0
开始,然后继续递增,直至达到len(mat_lst[0])
。所以我们遍历所有行索引。我们这样做是为了迭代所有列索引n
。
然后,对于每个行/列索引对,我们将计算sum(mat[m][n] for mat in mat_list)
。因此,我们为sum
中的所有矩阵mat[m][n]
计算mat
mat_list
。然后将该总和存储在我们正在构建的行中,并最终将该行添加到result
。
但我们也可以在这里使用嵌套列表理解:
def sum_matrices(mat_lst):
return [ [ sum(cells) for cells in zip(*rows) ] for rows in zip(*mat_lst)]