【问题标题】:itertools.accumulate() versus functools.reduce()itertools.accumulate() 与 functools.reduce()
【发布时间】:2012-12-17 10:33:07
【问题描述】:

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

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

两者之间还有其他区别吗?或者这只是最初不同用途的两个函数的行为问题,随着时间的推移开始收敛?

【问题讨论】:

标签: python itertools python-3.3 functools


【解决方案1】:

accumulate 似乎保留了之前的结果,而reduce(在其他语言中称为折叠)则不一定。

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

另外(只是为了好玩,不要这样做)您可以根据reduce 定义accumulate

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

【讨论】:

  • 我猜你的意思是operator.add。另外,我不知道最后一个 sn-p 是否真的有帮助:1)它返回一个列表,而 itertools.accumulate 返回一个可迭代的,2)它非常低效:)
  • 请参阅here 以获得更好的实施。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-07
      • 1970-01-01
      • 2021-01-16
      • 2018-07-31
      • 2021-05-09
      • 1970-01-01
      • 1970-01-01
      • 2016-01-19
      相关资源
      最近更新 更多