Как получить все промежуточные значения `lower` в дополнение к конечному результату?

1

Вызов 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.)

Теги:
python-3.x
reduce
itertools
functools

2 ответа

1

Вы можете использовать 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]
1
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]

Ещё вопросы

Сообщество Overcoder
Наверх
Меню