Как я могу сохранить каждую итерацию функции Reduce в списке? - PullRequest
3 голосов
/ 12 февраля 2020

В приведенном ниже коде вывод равен 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 ]

6 голосов
/ 12 февраля 2020

Вам нужна другая функция. 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]
0 голосов
/ 12 февраля 2020

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

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 не используется)

...