不使用SUM函数求嵌套列表的总和(练习)

4
尝试编写一个函数,它将每个列表的总和作为新单个列表中的各个值返回。例如:
[[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函数在此处不被允许,因为这是一个嵌套循环练习。
谢谢。

2
在第一个for循环内设置 total=0。同时确保您发布的代码缩进正确。 - Julien
7个回答

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 

3
错误在于您没有在每个循环后重新初始化 total 变量。相反,您应该在第一个 for 循环内部初始化 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  

没错。至少这是非常简单的事情。谢谢你。 - Robert Hemingway
@RobertHemingway 非常欢迎。如果您喜欢我的回答,请点赞。 - Vaibhav Bajaj

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的更多信息。

编辑:正如Sevanteri在评论中指出的那样,您还可以使用[functools.reduce(int.__add__, sublist, 0) for sublist in list](如果您真的想让您的老师发疯!)


2
而且由于整数已经有一个二进制加法函数,所以你可以用 int.__add__ 代替那个lambda。 :) - Sevanteri
@Sevanteri 哈哈哈,我喜欢这个想法! - nalzok
1
使用 int.__add__ 看起来有点丑,我更喜欢使用 operator.add :) - Copperfield

1

你需要将每个列表的总数清零。

def row_sums(square):
    total_list = []
    total = 0
    for i in square:
       for j in i: 
          total += j
       total_list.append(total)
       total = 0
    return total_list

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)]

-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)

-2

[sum(i) for i in zip(*[[2, 7, 6], [9, 5, 1], [4, 3, 8]])]

内置函数zip正是你需要的


1
OP想要在不使用sum的情况下,计算每个子列表中元素的总和,而不是所有子列表的组合。 - Copperfield

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接