2016-12-07 9 views
1

я хочу найти изящный способ достичь следующего:Объединяя карту и уменьшить

Притворитесь У меня есть список:

> x = [1, 2, 3, 4, 5] 

И простую функцию, которая просто добавляет два числа:

> def add(a, b) 
     return a+b 

Я могу сократить список x непосредственно:

> sum = reduce(add, x) 
> print(sum) 
15 

Который дает мне сумму просто отлично. Но я хотел бы знать значение после каждое приложение добавления. Таким образом, используя функцию, подобную уменьшить, я хотел бы получить обратно следующий массив:

> result = SOME_FUNCTION(add, x) 
> print(result) 
[3, 6, 10, 15] 

ли кто-нибудь есть классный способ достичь этого. У меня есть сильное предпочтение для использования той или иной форме itertools решения, если возможно :)

+1

Вы смотрите на функции 'itertools'? Один из них делает именно это. – vaultah

+1

Это называется суммой *. Попробуйте 'np.cumsum (x)' например. Вероятно, обман этого http://stackoverflow.com/questions/15889131/how-to-find-the-cumulative-sum-of-numbers-in-a-list –

+0

Соответствует: http://stackoverflow.com/questions/40009019/python-recursive-sum-list –

ответ

0

Так как вы хотите itertools

from itertools import accumulate 
list(accumulate(x)) 
Out [130]: 
[1, 3, 6, 10, 15] 

В качестве альтернативы петлевом Генератор

def cumsum(x): 
    total = 0 
    for x in it: 
     total += x 
     yield total 
list(cumsum(x)) 
Out [129]: 
[1, 3, 6, 10, 15] 

Или просто как уже упоминалось Дэвид:

np.cumsum(x) 
Out [123]: 
array([ 1, 3, 6, 10, 15], dtype=int32) 
+1

Вы можете использовать 'list (islice (accumlate (x), 1, None))' для удовлетворения ожидаемого результата OP –

+0

Я не знаю, как мне удалось пропустить накопление. Но это именно то, что мне нужно: P Bravo! и благодарю вас!!! – user2662833

+0

рад, что помог :) – SerialDev