2015-10-03 2 views
0
my_list = [0, 219, 211, 212, 212] 

Мне нужно просуммировать элементы таким образом:инкрементный сумма список номеров в Python 2.7

пункт + предмет, (пункт + пункт) + пункта (п + пункт + пункт) + пункт ...

0 + 219, (219) +211 (430) +212, (641) +212

чтобы быть более ясным, это сумма мне нужно получить:

new_list = [219, 430, 641, 853] 

Я думаю, что решение может быть понимание списка, что-то вроде этого вернет только сумму каждого элемента со следующим, хотя.

[(x + y) for (x, y) in zip(my_list[:-1], my_list[1:])] 

любая идея?

+0

Где '853' вдруг взялось? Не должно быть '[219, 430, 642]'? –

+0

641 ?? Объясните математику. –

+0

@AshwiniChaudhary: они добавили '211' дважды. –

ответ

0

... или что-то вроде этого, может быть,

b=0 
b = [sum(a[:k]) for k in range(1+len(a))] 

, вероятно, не слишком эффективно для больших списков.

Этот тест:

a = [7, 11, 24, 38] 

b=0 
b = [sum(a[:k]) for k in range(1+len(a))] 

print(a) 
print(b) 

дал:

>>> ================================ RESTART ================================ 
>>> 
[7, 11, 24, 38] 
[0, 7, 18, 42, 80] 
>>> 

Или делать то, что предложил Мартейн и использовать itertools.

[Как и в сторону - будет культура питон «идти найти библиотеку импорта» убить искусство кодирования?]

+0

Мой ответ не использует 'itertools', потому что это Python 2, а не Python 3. Мой ответ просто заимствует документацию Python 3' itertools' * в качестве источника для функции, которую я предложил использовать OP. –

+0

Спасибо, это именно то, что мне нужно! b = [sum (a [: k]) для k в диапазоне (1 + len (a))] – user270911

6

Вы можете скопировать itertools.accumulate() documentation description из Python 3:

import operator 

def accumulate(iterable, func=operator.add): 
    'Return running totals' 
    # accumulate([1,2,3,4,5]) --> 1 3 6 10 15 
    # accumulate([1,2,3,4,5], operator.mul) --> 1 2 6 24 120 
    it = iter(iterable) 
    try: 
     total = next(it) 
    except StopIteration: 
     return 
    yield total 
    for element in it: 
     total = func(total, element) 
     yield total 

Это просуммировать значения из списка ввода, производя нарастающий итог:

>>> my_list = [0, 219, 211, 212, 212] 
>>> list(accumulate(my_list)) 
[0, 219, 430, 642, 854] 

Вы можете адаптировать шаблон к вашему конкретному в случае, удалите func пункт настройки и проигнорируйте первое из которых:

Теперь она производит 3 значения для 4 входов:

>>> list(accumulate(my_list)) 
[219, 430, 642, 854] 
Смежные вопросы