2011-01-25 208 views
5

可能重复:
List comprehension for running totalPython列表理解

我试图写一个简要清单理解语句来创建一个CDF: 例如:

print f([0.2, 0.3,0.1,0.4]) 
[0.2,0.5,0.6,1.0] 

标准程序看起来像这样(我想写一个列表理解È函数f()):

def f(probabilities) : 

    sum = 0 
    returnList = [] 
    for count in probabilities: 
     sum +=count 
     returnList = returnList + [sum] 
    return returnList 

编辑:我发现了一个函数numpy.cumsum()。我会检查它是否使用列表解析。

+0

问题是什么? – Elalfer 2011-01-25 20:54:08

+0

@Elalfer - 这听起来像他想写一个行为与他的f()函数相同的列表理解。 – 2011-01-25 20:56:10

+0

这是正确的。我的不好,我应该更加明确。 – GeneralBecos 2011-01-25 21:16:52

回答

8

该操作非常常见,以至于许多语言(主要是功能语言,但不仅仅是)为其提供抽象,通常名称为scanl(它就像具有中间结果的reduce)。让我们把它ireduce(“迭代减少”):

def ireduce(f, state, it): 
    for x in it: 
     state = f(state, x) 
     yield state 

现在使用它:

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] 
8
[sum(probabilities[:i+1]) for i in range(len(probabilities))] 

但是不要这样做,因为它是O(n^2)。 Python列表解析不是为此设计的。使用您已经编写的程序代码。

1

这不是真的很漂亮,而且它不使用列表理解,但你可以用降低做到这一点()函数,其中累计值是保持当前的总和,结果列表中的元组:

a = [0.2, 0.3, 0.1, 0.4] 
reduce((lambda result, val: (result[0] + val, result[1] + [result[0] + val])), a, (0, []))[1] 

Python的缺乏多行拉姆达的支持使这种丑陋。使用单独的功能会更好:

a = [0.2, 0.3, 0.1, 0.4] 
    def accumulate(result, val): 
     return (result[0] + val, result[1] + [result[0] + val]) 

    reduce(accumulate, a, (0, []))[1]