2012-10-21 3 views
6

나는 한 묶음의 요소를리스트에 모아서 하나의 객체를 만드는 것과 비슷한 방식으로 최종 객체를 만듭니다. reduce에 대한 간단한 변형을 사용하려고합니다.이 작업을 수행하는 플랫 목록 대신 페어 목록을 고려하십시오. 나는의 라인을 따라 뭔가를하고 싶어 : 나는 숫자 nums 목록의 각 요소에 특정 합계에 추가 정보를 추가 할파이썬을 사용하여 쌍의 목록을 줄일 수

nums = [1, 2, 3] 
reduce(lambda x, y: x + y, nums) 

제외. 각 쌍 (A, B) 목록에서 (A + 나)와 같은 합계를 실행에 대한 예를 들어

nums = [(1, 0), (2, 5), (3, 10)] 
reduce(lambda x, y: (x[0]+x[1]) + (y[0]+y[1]), nums) 

이 작동하지 않습니다

>>> reduce(lambda x, y: (x[0]+x[1]) + (y[0]+y[1]), nums) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 1, in <lambda> 
TypeError: 'int' object is unsubscriptable 

는 왜 작동하지 않는 이유는 무엇입니까? 요점이 아닌 평평한 목록으로 nums을 인코딩 할 수 있다는 것을 알고 있습니다. 쌍의 목록을 반복하거나 동일한 길이의 두 목록을 동시에 반복 할 수있는 축소 작업을 만들고 싶습니다. 두 목록. 감사.

+0

당신이이 튜플로 감소의 결과를 원하십니까? –

+0

reduce를 사용해야합니까? 나는 단순한 것을 선호한다 sum (num [x]에 x [0] + x [1]) – cerealy

답변

6

당신이 reduce에 전달 된 람다에서 상대 : f에 의해 반환되는 값은 f의 또 다른 호출에 매개 변수로 전달됩니다

f = lambda x, y: (x[0]+x[1]) + (y[0]+y[1]) 

. 그러나 f은 매개 변수가 쌍으로 예상되지만 반환하는 값은 int입니다. 이 함수가 쌍을 반환하도록해야합니다. 예를 들어,이 별도로 왼쪽과 오른쪽 측면을 요약하면 다음과 같습니다

>>> nums = [(1, 0), (2, 5), (3, 10)] 
>>> reduce(lambda x, y: (x[0] + y[0], x[1] + y[1]), nums) 
(6, 15) 

당신이 목록 요소 다르게 축적 된 값을 처리한다 할 수있는 또 다른 일을 : 당신은 누적 값 int 할 수 있습니다, 목록 요소 동안 쌍입니다. 이렇게하면 누적이 int에 제대로 초기화 될 수 있도록, 당신은 reduceinitializer 인수를 전달해야합니다

>>> nums = [(1, 0), (2, 5), (3, 10)] 
>>> reduce(lambda acc, y: acc + y[0] + y[1], nums, 0) 
21 
+0

쌍을 줄여서 반복자를 얻는 방법이 있나? 리스트에 대해'enumerate (mylist) '와 비슷한 것. 현재 엘레멘트뿐만 아니라리스트의 위치도 리턴한다. 위의 예제에서'reduce '의'lambda'가 쌍의 수에 접근 할 수 있습니까? – user248237dfsf

+0

@ user248237'reduce '의 입력으로'enumerate (mylist)'를 사용할 수 있습니다. – interjay

관련 문제