I have a list:
lst = [1, 2, 3, 5, 0, 0, 9, 45, 3, 0, 1, 7]
And I need the sum of the elements between the 0
s in a new list. I tried
lst1 = []
summ = 0
for i, elem in enumerate(lst):
if elem != 0:
summ = summ + elem
else:
lst1.append(summ)
lst1.append(elem)
summ = 0
but it returns [11, 0, 0, 0, 57, 0]
, while I expect [11, 0, 0, 57, 0, 8]
Here's one way to this with itertools.groupby
and a list comprehension . The grouping is done by checking if an element is zero, and if not zero, all items in the group are summed:
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]
And of course, if items in your list are only numbers (to avoid generalising and introducing ambuigities), the lambda
can be replaced with bool
:
result = [i for k, g in groupby(lst, bool) for i in ((sum(g),) if k else g)]
you are appending extra summ when its 0, and missing 1 summ at the end
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]
Just add an extra lst1.append(summ)
after the loop
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)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.