只需执行以下练习题:将“数字方块”作为参数并返回列总和的列表。
e.g
square = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]
]
结果应为=
[28, 32, 36, 40]
到目前为止我所拥有的:
def column_sums(square):
col_list = []
for i in range(len(square)):
col_sum = 0
for j in range(len(square[i])):
col_sum += square[j]
col_list.append(col_sum)
return col_list
所以我认为我已经列出了所有参数,并且所有索引都正确,但我被卡住了因为我收到错误
builtins.TypeError: unsupported operand type(s) for +=: 'int' and 'list'
如果我引用我认为的列表中的元素,那么不应该发生这种情况。
此处使用SUM命令可能更容易,但无法找到一种干净利用它的方法。
通过索引从单独的列表中添加元素。
答案 0 :(得分:2)
更简单的解决方案是使用zip
转置列表列表,并在每个新子列表中使用sum
:
def column_sums(square):
return [sum(i) for i in zip(*square)]
zip(*square)
解包列表列表,并连续返回每列中的所有项目(压缩作为元组)。
>>> column_sums(square)
[28, 32, 36, 40]
您也可以使用numpy.sum
将axis
参数设置为0
,即行(即每列的总和):
>>> import numpy as np
>>> square = np.array(square)
>>> square.sum(axis=0)
array([28, 32, 36, 40])
答案 1 :(得分:1)
应该是col_sum += square[j][i]
,因为您要访问位置j
列表中i
位置的元素。
答案 2 :(得分:1)
您应该将汇总行更改为:
col_sum += square[j][i]
因为square [j]是j'th
行(列表),但您需要当前列,即该行中的i'th
元素。
但这是我使用sum
和列表推导的解决方案:
def column_sums2(square):
def col(i):
return [row[i] for row in square]
return [sum(col(i)) for i in range(len(square))]