2016-11-24 3 views
4

У меня есть список:Sum элементы списка между нулями в Python

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

Что вы EXPE cted. –

+0

@YevhenKuzmovych '[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] 

И, конечно же, если элементы в списке только цифры (чтобы избежать обобщающих и введения ambuigities), то lambda может быть заменено bool:

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

Теперь это намного лучше :) –

+1

Вы можете избавиться от этой лямбда: '[i для k, g в groupby (lst, bool) для i in ((sum (g),), если k else g)]' –

+0

@ PM2Ring Спасибо за голову –

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]' –

+0

yes, он возвращает '[11, 0 , 0, 0, 57, 0, 8] ' –

+1

Да, но вы хотели' [11, 0, 0, 57, 0, 8] ' – Bart

2

вы добавление дополнительных Сумм, когда его 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] 
Смежные вопросы