Как я могу сохранить каждую итерацию функции Reduce в списке?

В приведенном ниже коде вывод равен 38 , и я хочу отдельный список с выводом [34,36,38] .

from functools import *
nums = [0, 34, 2, 2]
sum_num = reduce(lambda a, b : a+b, nums)

Так как функция сокращения добавляет 0 и 34 , мне нужно добавить это значение в отдельный список, теперь во второй итерации мне нужно добавить 34 + 2 в список. и, наконец, 38 будут добавлены в список. какой кусок кода мне нужно добавить, чтобы получить желаемый результат?

Всего 2 ответа


Вам нужна другая функция. itertools.accumulate() генерирует все промежуточные результаты, которые functools.reduce() создает под обложками:

>>> from itertools import accumulate
>>> nums = [0, 34, 2, 2]
>>> list(accumulate(nums))
[0, 34, 36, 38]

Он использует сложение по умолчанию. Или вы можете вместо этого передать любую другую функцию с двумя аргументами:

>>> list(accumulate(nums, lambda a, b: a + b)) # same as the default
[0, 34, 36, 38]
>>> list(accumulate(nums, lambda a, b: a + 2*b))
[0, 68, 72, 76]

Если вы не хотите 0 в начале, вам придется избавиться от этого самостоятельно; например,

>>> f = accumulate(nums)
>>> next(f)  # throw out first result
0
>>> list(f)  # and make a list out of what remains
[34, 36, 38]

Согласно документам , функция приведения примерно эквивалентна:

def reduce(function, iterable, initializer=None):
    it = iter(iterable)
    if initializer is None:
        value = next(it)
    else:
        value = initializer
    for element in it:
        value = function(value, element)
    return value

Итак, чтобы получить каждую сумму по мере прохождения процесса, мы можем использовать функцию:

def reduce(function, iterable):
    it = iter(iterable)
    value = next(it)
    values = []
    for element in it:
        value = function(value, element)
        values.append(value)
    return values

(Упрощено, поскольку параметр initializer не используется)


Есть идеи?

10000