2012-09-02 1 views
5

당신은 편리한 reduce 함수를 파이썬으로 알고 있습니다. 반환파이썬에서 reducelist : reduce와 같이 중간 결과 목록을 제공합니다.

reduce(lambda x,y: x+y, [1,2,3,4], 0) 

(((0 + 1) +2) +3) + : 예를 들어, (내장 sum이없는 척)과 같이 목록을 요약하는 데 사용할 수 있습니다 4 = 10.

이제 중간 합계 목록을 원한다면 어떻게해야합니까? 이 경우 [1,3,6,10]입니다.

다음은 추한 솔루션입니다. 뭔가 좀 더 파이썬이 있습니까?

def reducelist(f, l, x): 
    out = [x] 
    prev = x 
    for i in l: 
    prev = f(prev, i) 
    out.append(prev) 
    return out 
+0

적어도 하스켈에서는 * 스캔 *이라고합니다. 축소는 함수 프로그래밍 세계에서 (특정 종류의) * 배 *라고도합니다. – delnan

+0

감사합니다. delnan, 예, Mathematica에서 FoldList로 알고 있습니다. Mathematica는 "List"를 추가하여 표시 한 함수 프로그래밍 함수를 많이 모아 놓은 버전입니다. 나는 아래 답변에서 파이썬 3에서 reducelist라고 부르는 것을 accumulate()로 사용할 수 있음을 알 수있다. – dreeves

답변

8

내가 좋아하는, 당신은 충분히 최근 있다면 :

Python 3.2.1 (default, Jul 12 2011, 22:22:01) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import itertools 
>>> itertools.accumulate([1,2,3,4]) 
<itertools.accumulate object at 0x1006baad0> 
>>> list(itertools.accumulate([1,2,3,4])) 
[1, 3, 6, 10] 

accumulate는 함수의 인수 받아 [더 최근의를 though-- 3.3] :

>>> list(itertools.accumulate([1,2,3,4], lambda x,y: x+y)) 
[1, 3, 6, 10] 
>>> list(itertools.accumulate([1,2,3,4], lambda x,y: x+y+1)) 
[1, 4, 8, 13] 
+0

아, 멋지다! 비록 나에게 이것은 (파이썬 2에있는) 너무 최근의 것이거나 너무 구체적이다 (이것은 합계를위한 것이지 내가 찾고있는 일반 감속 사물이 아니다). 편집 : 아, 그것은 * 일반적으로 충분히 선택적 인수와 함께; 감사! – dreeves

8

당신이 만약 생성기에 대한 솔루션을 더 짧게 만들면 기능 프로그래밍 스타일에 더 잘 부합합니다. 나도 X 0의 기본 값을 추가합니다 :

def reducelist(f, lst, x=0): 
    prev = x 
    for i in lst: 
    prev = f(prev, i) 
    yield prev 

확실히 더 파이썬 즉.

+0

감사! 실제 목록을 반환해야하는 경우 어떻게해야합니까? 함수 안에서 변환을 할 수 있습니까? 그것은 반복적으로 추가하여 목록을 구성하는 것보다 여전히 좋을까요? – dreeves

+0

'list' 함수를 사용하여 생성기를 목록으로 변환하는 함수의 사용자에게 맡깁니다. 리스트를 직접적으로 반환하는 함수를 원한다면 당신은 도우 퍼 함수'reducelist_helper (f, lst, x = 0)를 만들 수있다 : return list (reducelist (f, lst, x))' – halex