【问题标题】:How to get result of "reduce" at every step in Python? [duplicate]如何在 Python 的每一步都得到“减少”的结果? [复制]
【发布时间】:2015-10-02 00:13:59
【问题描述】:

在 Python 中,如果我想使用显式函数式编程来总结一个列表,我可以这样做

>>> import operator
>>> reduce(operator.add, [3, -1, 2])
4

Mathematica 比 Python 更接近纯函数式语言,将其称为 Fold 而不是 reduce,但结果是一样的。

In[1]:= Fold[Plus, {3, -1, 2}]
Out[1]= 4

所以现在,在 Mathematica 中,如果我想在迭代过程中的每一步都得到“折叠”的结果,我可以使用函数 FoldList

In[2]:= FoldList[Plus, {3, -1, 2}]
Out[2]= {3, 2, 4}

如何在 Python 中获得这样的列表(或者最好是迭代器)?一般来说,这个函数式操作有名字吗?

【问题讨论】:

  • 子程序通常称为scan,数学运算称为prefix sum
  • @gnat 与其对我的帖子投反对票,如果你是一个模组,你能把问题移到正确的板上吗?我的问题很好,我的回答是正确的。我似乎总是选错 StackExchange。
  • 几年前,我尝试通过重新发布将问题从我认为 Stack Overflow 转移到 Server Fault,但模组告诉我,我不应该这样做,而且我应该要求他们移动问题。

标签: python functional-programming


【解决方案1】:

我找到了正确的函数:在 Python 中,它被称为 accumulate

>>> from itertools import accumulate
>>> list(accumulate([3, -1, 2], operator.add))
[3, 2, 4]

它似乎只在 Python 3 中可用。但是现在每个人都升级了,对吧? :)

【讨论】:

  • 简单的list(accumulate([3, -1, 2])) 就足够了。 itertools.accumulate 是 Python 3.2 中的新功能。
  • 我来这个问题(基于它的总标题)是用更一般的功能而不是operator.add(比如lambda x, y: 2*x + 0.1*y)。对于此类功能,解决方案也适用。如果您的问题超出了总和,您可以考虑对其进行编辑并强调其一般目的。
猜你喜欢
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多