Python列表理解

Gen*_*cos 5 python functional-programming list-comprehension

可能重复:
运行总计的列表理解

我正在尝试编写一个简洁的列表理解语句来创建一个cdf:例如:

print f([0.2, 0.3,0.1,0.4])
[0.2,0.5,0.6,1.0] 
Run Code Online (Sandbox Code Playgroud)

标准过程看起来像这样(我想为函数f()写一个列表解析):

def f(probabilities) :

    sum = 0
    returnList = []
    for count in probabilities:
        sum +=count
        returnList = returnList + [sum]
    return returnList
Run Code Online (Sandbox Code Playgroud)

编辑:我找到了一个函数numpy.cumsum().我会检查它是否使用列表推导.

nov*_*lis 8

[sum(probabilities[:i+1]) for i in range(len(probabilities))]
Run Code Online (Sandbox Code Playgroud)

但是不要这样做,因为它是O(n ^ 2).Python列表推导不是为此而设计的.使用您已编写的过程代码.


tok*_*and 8

这个操作是如此常见,以至于许多语言(主要是功能性的,但不仅仅是)为它提供抽象,通常使用名称scanl(它类似于reduce中间结果).我们称之为ireduce("迭代减少"):

def ireduce(f, state, it):
    for x in it:
        state = f(state, x)
        yield state
Run Code Online (Sandbox Code Playgroud)

现在使用它:

import operator

def f(probabilities):
    return ireduce(operator.add, 0, probabilities)

print(list(f([0.2, 0.3,0.1,0.4])))
# [0.2, 0.5, 0.6, 1.0]
Run Code Online (Sandbox Code Playgroud)