2011-01-25 3 views
5

가능한 중복 :
List comprehension for running total파이썬리스트 통합

나는 CDF를 만들 간결한 지능형리스트 문을 작성하려고 해요 :

print f([0.2, 0.3,0.1,0.4]) 
[0.2,0.5,0.6,1.0] 
: 예를 들어

표준 절차는 다음과 같을 것입니다 (나는 th에 대한 목록 이해력을 쓰고 싶습니다. 함수 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) 인 작업이 일반적입니다.

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

를 이제 사용 : ("반복 감소") ireduce의 그것을 부르 자

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'이라고 부르며, 기본적으로 연산에 덧셈을 사용합니다. –

+0

@ 칼. 어떤 사람들은 그것을 ireduce라고 부릅니다. "partial_sum"은 추가 할 때 좋은 이름이지만 다른 작업은 오해의 소지가 있습니다. – tokland

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

하지만 O (n^2)이기 때문에하지 마십시오. 파이썬 목록 comprehensions이 위해 설계되지 않았습니다. 이미 작성한 절차 코드를 사용하십시오.

+0

이제는 멋진 목록 이해력 중 하나입니다. – 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] 

파이썬 부족 추한 이런 종류의 수는. 별도의 함수를 사용하면 더 좋을 것입니다 :

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]