2011-01-25 17 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

+0

@Elalfer - 彼の行動が彼の 'f()'関数のものと同じであるリストの理解を書いたがっているように思えます。 –

+0

それは正しいです。私の悪い、私はより明示的だったはずです。 – GeneralBecos

答えて

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] 
+0

これはツールボックスに入れるのが良いことです。しかし確かに他の言語がそれを呼んでいるものをコピーするのではなく、もっとPythonicという名前を考えることができますか? FWIW、C++はこの 'std :: partial_sum'を呼び出し、デフォルトで操作として追加を使用します。 @Karl。 –

+0

それはireduceと呼ばれる人もいます。 "partial_sum"は追加時にはいい名前ですが、他の操作ではやや誤解を招くようです。 – tokland

8
[sum(probabilities[:i+1]) for i in range(len(probabilities))] 

しかし、それはO(n^2)なのでありません。 Pythonのリスト内包はこのために設計されていませんでした。すでに書いた手続き型コードを使用してください。

+0

これで1つの素晴らしいリストの理解です。 – user225312

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] 
関連する問題