Python中的reducelist:类似reduce,但是给出中间结果的列表

2024-06-16 10:20:53 发布

您现在位置:Python中文网/ 问答频道 /正文

您知道Python中的handy reduce函数。例如,您可以使用它来总结如下列表(假设没有内置的sum):

reduce(lambda x,y: x+y, [1,2,3,4], 0)

返回(((0+1+2)+3)+4=10。在

如果我想要一份中间金额的清单呢?在本例中,[1,3,6,10]。在

这是一个丑陋的解决方案。还有更像Python的吗?在

^{pr2}$

Tags: lambda函数reduce列表解决方案金额内置handy
3条回答

注意:在我写这篇文章之前,不知怎么的我错过了@DSM的答案。去读一读然后投那个,我就投了。如果你想要更长时间的回答,请回来。在

Python有这个特性,称为accumulate,它是从python3.2开始在itertools标准库模块中实现的。可选的第二个参数“func”是在3.3中添加的。在

import itertools

l = [1,2,3,4]
out = itertools.accumulate(l)

在本例中,out是一个iterable。如果你需要一份名单,那么

^{pr2}$

accumulate()函数可用于生成一个连续的总计,或“累计和”。默认功能是加法。我们可以将函数作为第二个参数传入:

import itertools
import operator

l = [1,2,3,4]
factorial = itertools.accumulate(l, operator.mul)

我们进去了操作员.mul使乘法产生一个运行的乘积。operator模块导出一组与Python的内在运算符相对应的有效函数。在

当然,我们不局限于operator模块中定义的函数。您可以使用任何接受第一个参数中元素类型的2个参数的函数。您可以发挥创造性,但在这里我将相反地使用lambda显式实现默认的加法/求和行为:

import itertools

l = [1,2,3,4]
out = itertools.accumulate(l, lambda a, b: a + b)

最后,既然您提出了这个问题,我认为使用accumulate比您的循环示例更像python。在

如果你把你的解决方案生成一个生成器,它更短,它更好地遵守函数式编程风格。我也会为x添加一个默认值0:

def reducelist(f, lst, x=0): 
  prev = x
  for i in lst: 
    prev = f(prev, i)
    yield prev

那绝对是比Python更厉害的。在

我最喜欢的,如果你够新的话:

Python 3.2.1 (default, Jul 12 2011, 22:22:01) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import itertools
>>> itertools.accumulate([1,2,3,4])
<itertools.accumulate object at 0x1006baad0>
>>> list(itertools.accumulate([1,2,3,4]))
[1, 3, 6, 10]

accumulate还接受一个函数参数[尽管是3.3],但它是最新的:

^{pr2}$

相关问题 更多 >