JAB JAB - 6 months ago 8
Python Question

itertools.accumulate() versus functools.reduce()

In Python 3.3,

, which normally repeatedly applies an addition operation to the supplied iterable, can now take a function argument as a parameter; this means it now overlaps with
functools.reduce()
. With a cursory look, the main differences between the two now would seem to be:


  1. accumulate()
    defaults to summing but doesn't let you supply an extra initial condition explicitly while
    reduce()
    doesn't default to any method but does let you supply an initial condition for use with 1/0-element sequences, and 2)

  2. accumulate()
    takes the iterable first while
    reduce()
    takes the function first



Are there any other differences between the two? Or is this just a matter of behavior of two functions with initially distinct uses beginning to converge over time?

Wes Wes
Answer

It seems that accumulate keeps the previous results, whereas reduce (which is known as fold in other languages) does not necessarily.

e.g. list(accumulate([1,2,3], operator.plus)) would return [1,3,6] whereas a plain fold would return 6

Also (just for fun, don't do this) you can define accumulate in terms of reduce

def accumulate(xs, f):
    return reduce(lambda a, x: a + [f(a[-1], x)], xs[1:], [xs[0]]) 
Comments