Python中的reducelist:比如reduce,但给出了中间结果列表

dre*_*ves 10 python reduce functional-programming list

你知道reducePython中的方便功能.例如,您可以使用它来总结这样的列表(假装没有内置总和):

reduce(lambda x,y: x+y, [1,2,3,4], 0)
Run Code Online (Sandbox Code Playgroud)

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

现在如果我想要一个中间总和列表怎么办?在这种情况下,[1,3,6,10].

这是一个丑陋的解决方案.还有更多的pythonic吗?

def reducelist(f, l, x): 
  out = [x]
  prev = x
  for i in l:
    prev = f(prev, i)
    out.append(prev)
  return out
Run Code Online (Sandbox Code Playgroud)

DSM*_*DSM 14

我最喜欢的,如果你最近的话:

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]
Run Code Online (Sandbox Code Playgroud)

accumulate也接受函数参数[更近期,但是 - 3.3]:

>>> list(itertools.accumulate([1,2,3,4], lambda x,y: x+y))
[1, 3, 6, 10]
>>> list(itertools.accumulate([1,2,3,4], lambda x,y: x+y+1))
[1, 4, 8, 13]
Run Code Online (Sandbox Code Playgroud)


hal*_*lex 9

如果您使用生成器来解决它的问题,它会更短,并且更好地遵循函数式编程风格.我也会为x添加默认值0:

def reducelist(f, lst, x=0): 
  prev = x
  for i in lst: 
    prev = f(prev, i)
    yield prev
Run Code Online (Sandbox Code Playgroud)

这绝对是更加pythonic.