我有一个清单:
lst = [1, 2, 3, 5, 0, 0, 9, 45, 3, 0, 1, 7]
Run Code Online (Sandbox Code Playgroud)
我需要0新列表中s 之间的元素总和.我试过了
lst1 = []
summ = 0
for i, elem in enumerate(lst):
if elem != 0:
summ = summ + elem
else:
lst1.append(summ)
lst1.append(elem)
summ = 0
Run Code Online (Sandbox Code Playgroud)
但它回归[11, 0, 0, 0, 57, 0],而我期待
[11, 0, 0, 57, 0, 8]
这是一种方法,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]
Run Code Online (Sandbox Code Playgroud)
当然,如果列表中的项目只是数字(为了避免一般化和引入相关性),lambda可以替换为bool:
result = [i for k, g in groupby(lst, bool) for i in ((sum(g),) if k else g)]
Run Code Online (Sandbox Code Playgroud)