我有一个清单:
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]
答案 0 :(得分: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]
当然,如果列表中的项目只是数字(为了避免一般化和引入不足之处),lambda
可以替换为bool
:
result = [i for k, g in groupby(lst, bool) for i in ((sum(g),) if k else g)]
答案 1 :(得分:2)
当你的0为0时,你会追加额外的总和,并且在结尾处缺少1个总和
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]
答案 2 :(得分: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)