Каким будет Pythonic способ выполнения сокращения с накоплением?
Например, возьмем Reduce()
пользователя R
. . Учитывая список и произвольную лямбда-функцию, он позволяет получить вектор накопленных результатов, а не только окончательный результат, установив accumulate=T
. Примером этого с простым умножением в качестве лямбда-функции может быть (взято из этого ответа):
Reduce(`*`, x=list(5,4,3,2), accumulate=TRUE)
# [1] 5 20 60 120
Важно, чтобы можно было использовать произвольную лямбда-функцию (например, lambda x, y: ...
), поэтому решения, которые позволяют, например, только использование суммы, умножения или чего-то еще не поможет. Я не смог придумать решение Pythonic, чтобы сделать это, например. itertools
или functools
, но способ есть. И хотя есть множество других вопросов и ответов о сокращении и особенно о накоплении с помощью Python, я пока не нашел общего ответа.
Не-Pythonic пример, использующий цикл для выполнения накопленного сокращения с произвольной лямбда-функцией, может выглядеть так:
# the source list
l = [0.5, 0.9, 0.8, 0.1, 0.1, 0.9]
# the lambda function for aggregation can be arbitrary
# this one is just made up for the example
func = lambda x, y: x * 0.65 + y * 0.35
# the accumulated reduce:
# a) the target list with initializer value hardcoded
l2 = [l[0]]
# b) the loop
for i in range(1, len(l)):
l2 += [func(
l2[i-1], # last value in l2
l[i] # new value from l
)]
Итак: как бы вы сделали сокращение с накоплением и произвольной лямбда-функцией в стиле Python?