Вызов functools.reduce
возвращает только окончательный результат:
>>> from functools import reduce
>>> a = [1, 2, 3, 4, 5]
>>> f = lambda x, y: x + y
>>> reduce(f, a)
15
Вместо того, чтобы писать цикл самостоятельно, существует ли функция, которая также возвращает промежуточные значения?
[3, 6, 10, 15]
(Это всего лишь простой пример, я не пытаюсь вычислить совокупную сумму - решение должно работать для произвольных a
и f
.)
Вы можете использовать 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]
import numpy as np
x=[1, 2, 3, 4, 5]
y=np.cumsum(x) # gets you the cumulative sum
y=list(y[1:]) # remove the first number
print(y)
#[3, 6, 10, 15]