尝试编写一个函数,该函数获取每个列表的总和并在新的单个列表中返回单个值。 E.g
[[2, 7, 6], [9, 5, 1], [4, 3, 8]]
成为
[15, 15, 15]
到目前为止:
def row_sums(square):
total_list = []
total = 0
for i in square:
for j in i:
total += j
total_list.append(total)
return total_list
但这只会将每个列表相互累积,从而产生:
[15, 30, 45]
我不确定如何将每个列表的总和分开。此处不允许使用SUM函数,因为它是对嵌套循环的练习。
感谢。
答案 0 :(得分:3)
您需要重置total
计数器才能启动每个计数器。
此外,您不需要在外面声明它,因为您只会在里面使用它。
def row_sums(square):
total_list = []
for i in square:
total = 0
for j in i:
total += j
total_list.append(total)
return total_list
答案 1 :(得分:3)
错误是您不会在每次循环后重新初始化total
变量。相反,首先在他内部初始化sum = 0
,如下所示:
def row_sums(square):
total_list = []
for i in square:
total = 0
for j in i:
total += j
total_list.append(total)
return total_list
答案 2 :(得分:2)
只是为了好玩:
>>> list = [[2, 7, 6], [9, 5, 1], [4, 3, 8]]
>>> import functools
>>> [functools.reduce(lambda x, y: x + y, sublist, 0) for sublist in list]
[15, 15, 15]
我没有使用sum
:)
您可以详细了解functools.reduce
here。
编辑:正如Sevanteri在评论中指出的那样,你也可以使用[functools.reduce(int.__add__, sublist, 0) for sublist in list]
(如果你真的想让你的老师疯狂!)
答案 3 :(得分:1)
您需要将每个列表的总数归零。
addOperationWithBlock
答案 4 :(得分:0)
为了与众不同,将列表展平并使用生成器(假设子列表的长度相同):
def _notsum2(lists):
per_yield = len(lists)
total = 0
for ind, next in enumerate(val for sublist in lists for val in sublist):
if ind % per_yield == 0 and ind:
yield total
total = 0
total += next
yield total
if __name__ == '__main__':
li = [[2, 7, 6], [9, 5, 1], [4, 3, 8]]
print [g for g in _notsum2(li)]
答案 5 :(得分:-1)
您也可以使用map
和列表理解来执行此操作:
l=[[2, 7, 6], [9, 5, 1], [4, 3, 8]]
a,b,c=[x for x in l]
map(lambda x,y,z:x+y+z, a,b,c)
答案 6 :(得分:-2)
[sum(i) for i in zip(*[[2, 7, 6], [9, 5, 1], [4, 3, 8]])]
bultin zip func是你真正需要的