Вы можете использовать itertools.accumulate()
:
>>> from itertools import accumulate
>>> list(accumulate([1, 2, 3, 4, 5], lambda x, y: x+y))[1:]
[3, 6, 10, 15]
Обратите внимание, что порядок параметров переключается относительно functools.reduce()
.
Также по умолчанию func
(второй параметр) - это сумма (например, operator.add
), поэтому в вашем случае это технически необязательно:
>>> list(accumulate([1, 2, 3, 4, 5]))[1:] # default func: sum
[3, 6, 10, 15]
И, наконец, стоит отметить, что accumulate()
будет включать первый членв последовательности, следовательно, почему результат индексируется из [1:]
выше.
В своем редактировании вы заметили, что ...
Это всего лишь простой примерЯ не пытаюсь вычислить кумулятивную сумму - решение должно работать для произвольных a и f.
Хорошая особенность accumulate()
в том, что она гибка в отношении вызываемого объекта.Требуется только вызываемый объект, который является функцией двух параметров.
Например, встроенный max()
удовлетворяет следующему:
>>> list(accumulate([1, 10, 4, 2, 17], max))
[1, 10, 10, 10, 17]
Это более длинная формаиспользуя ненужную лямбду:
>>> # Don't do this
>>> list(accumulate([1, 10, 4, 2, 17], lambda x, y: max(x, y)))
[1, 10, 10, 10, 17]