itertools.accumulate()与functools.reduce()

时间:2013-01-03 03:15:44

标签: python itertools python-3.3 functools

在Python 3.3中,itertools.accumulate()通常会重复对提供的iterable应用加法运算,现在可以将函数参数作为参数;这意味着它现在与functools.reduce()重叠。粗略看一下,两者之间的主要区别似乎是:

  1. accumulate()默认为求和但不允许您明确提供额外的初始条件,而reduce()不默认为任何方法,但允许您提供初始条件以用于1/0 - 元素序列和
  2. accumulate()首先获取可迭代,而reduce()首先获取该函数。
  3. 两者之间是否存在其他差异?或者这仅仅是两个函数的行为问题,最初的不同用途开始随时间收敛?

3 个答案:

答案 0 :(得分:21)

似乎accumulate保留了以前的结果,而reduce(在其他语言中称为fold)并不一定。

e.g。 list(accumulate([1,2,3], operator.plus))将返回[1,3,6],而普通折叠将返回6

另外(只是为了好玩,不要这样做)你可以用accumulate

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

答案 1 :(得分:5)

您可以在文档中看到有什么区别。 reduce会返回单个结果,即序列的总和,产品等。 accumulate通过 all 返回中间结果的迭代器。基本上,accumulate会在reduce操作的每个步骤的结果上返回迭代器。

答案 2 :(得分:3)

itertools.accumulate  与reduce类似,但返回生成器*而不是值。该生成器可以为您提供所有中间步骤值。所以基本上减少会给你积累的最后一个元素。

*生成器就像一个迭代器,但只能迭代一次。