itertools.accumulate()与functools.reduce()

JAB*_*JAB 16 python python-itertools python-3.3 functools

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

  1. accumulate()默认为求和但不允许显式提供额外的初始条件,reduce()而不默认为任何方法但允许您提供初始条件以使用1/0元素序列,并且
  2. accumulate()首先采用迭代,然后先reduce()获取函数.

这两者之间还有其他差异吗?或者这仅仅是两个函数的行为问题,最初的不同用途开始随时间收敛?

Wes*_*Wes 22

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

例如,list(accumulate([1,2,3], operator.add))将返回,[1,3,6]而普通折叠将返回6

同时,(只是为了好玩,不这样做),你可以定义accumulate来讲reduce

def accumulate(xs, f):
    return reduce(lambda a, x: a + [f(a[-1], x)], xs[1:], [xs[0]]) 
Run Code Online (Sandbox Code Playgroud)

  • 我猜你的意思是'operator.add`.另外,我不知道最后一个片段是否真的有用:1)它返回一个列表,而`itertools.accumulate`返回一个iterable,2)它非常低效:) (2认同)

ian*_*kit 6

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

*生成器类似于迭代器,但只能迭代一次。


Bre*_*arn 5

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