在Python中,计算列表中两个零之间元素的总和

4

我有一个列表:

lst = [1, 2, 3, 5, 0, 0, 9, 45, 3, 0, 1, 7]

我需要在一个新的列表中计算两个 0 之间元素的和。 我已经尝试过了。

lst1 = []
summ = 0
for i, elem in enumerate(lst):
    if elem != 0:
        summ = summ + elem
    else:
        lst1.append(summ)
        lst1.append(elem)
        summ = 0

但它返回的是[11, 0, 0, 0, 57, 0],而我期望得到的是[11, 0, 0, 57, 0, 8]


你期望的输出是什么? - Yevhen Kuzmovych
@YevhenKuzmovych [11, 0, 0, 57, 0, 8] - Petr Petrov
你想要做什么?你的期望是什么?这段代码按照原样可以工作。 - Kush Patel
1
在循环之外添加额外的 lst1.append(summ) - Stormvirux
3个回答

7
这里有一种使用itertools.groupby和列表理解的方法。通过检查元素是否为零来进行分组,如果不为零,则对该组中的所有项求和:
from itertools import groupby

lst = [1, 2, 3, 5, 0, 0, 9, 45, 3, 0, 1, 7]
f = lambda x: x==0
result = [i for k, g in groupby(lst, f) for i in (g if k else (sum(g),))]
print(result)
# [11, 0, 0, 57, 0, 8]

当然,如果列表中的项目只是数字(为了避免概括和引入歧义),则可以使用bool替换lambda

result = [i for k, g in groupby(lst, bool) for i in ((sum(g),) if k else g)]

2
现在好多了 :) - Moinuddin Quadri
1
你可以去掉那个lambda表达式:[i for k, g in groupby(lst, bool) for i in ((sum(g),) if k else g)] - PM 2Ring
@PM2Ring 感谢您的提醒。 - Moses Koledoye
@PM2Ring 为了让代码更易读,不得不将 lambda 提取出来。 - Moses Koledoye

2
你在当summ为0时添加了额外的summ,而在结尾缺少了一个summ。
lst = [1, 2, 3, 5, 0, 0, 9, 45, 3, 0, 1, 7]
lst1 = []
summ = 0
for i, elem in enumerate(lst):
    if elem != 0:
        summ = summ + elem
    else:
        if summ:
            lst1.append(summ)
        lst1.append(elem)
        summ = 0

if summ:
    lst1.append(summ)
# lst1 = [11, 0, 0, 57, 0, 8]

0
只需在循环后添加额外的 lst1.append(summ) 即可。
lst1 = []
summ = 0
for i, elem in enumerate(lst):
    if elem != 0:
        summ = summ + elem
    else:
        if summ:
            lst1.append(summ)
        lst1.append(elem)
        summ = 0
lst1.append(summ)

1
这不会产生期望的输出:[11, 0, 0, 57, 0, 8] - Eugene Yarmash
1
是的,但你想要的是 [11, 0, 0, 57, 0, 8] - Bart
此外,它无法处理 lst 以零结尾的情况。请参考 Skycc 的回答。 - PM 2Ring
这样就好多了,但是如果lst以零结尾仍然无法处理。 - PM 2Ring

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