2011-01-25 203 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]