2013-08-16 2 views
3

두 개의 다른 값에 대한 합계를 목록에서 가져오고 싶습니다. 예를 들어 :하나의 목록에서 두 개의 합계

sample = [(1,3), (4,5), (8,2)] 

나는 출력이

13, 10 

내가 다른 몇 가지 방법으로 그것을 할 수 있도록하고 싶습니다. 현재 가지고있는 방법은 다음과 같습니다.

t1 = 0 
t2 = 0 
for item1, item2 in sample: 
    t1 += item1 
    t2 += item2 

이 문제를 해결하기 위해 더 많은 Pythonic 방법이있을 것입니다.

+0

대체 코드가 실제로 작동하지 않습니다. 'sample [0] == (1, 3)'. – user2357112

+0

아, 잘 잡으세요. 네가 맞다. 나는 그 예를 풀어 낼 것이다. –

답변

7

이 작업을 시도 할 수 있습니다 :

from itertools import izip 
sample = [(1,3), (4,5), (8,2)] 
t1, t2 = map(sum, izip(*sample)) 

당신은 대신 map의 지능형리스트를 사용할 수 있습니다.

from itertools import izip 
sample = [(1,3), (4,5), (8,2)] 
t1, t2 = [sum(t) for t in izip(*sample)] 

그리고 당신은 두 개 이상의 금액으로 처리 할 수는 :

from itertools import izip 
sample = [(1, 3, 1), (4, 5, 1), (8, 2, 1)] 
sums = [sum(t) for t in izip(*sample)] 
# sums == [13, 10, 3] 
+1

'itertools.izip'은 더 좋을 것이라고 생각합니다. 왜냐하면'zip'은 여전히 ​​OP가 피하고 싶어하는 루프를 효과적으로 두 번 반복해야하기 때문입니다. –

+0

세 번째 예제는이 경우 이상적이라고 생각합니다. 감사합니다. –

+0

@SilasRay itertools.izip을 지적 해 주셔서 감사합니다. 예제를 사용하도록 변경했습니다. – FastTurtle

2
sample = [(1,3), (4,5), (8,2)] 

r1 = 0 
r2 = 0 
for v in sample: 
    r1, r2 = r1+v[0], r2+v[1] 

print r1, r2 

@ FastTurtle 만의 쿨러입니다.

2

한 - 라이너 :

sum([ x[0] for x in sample ]), sum([ x[1] for x in sample ]) 

또는 알 수없는 차원의 목록에 대한 :

map(lambda i: sum(x[i] for x in sample), range(len(sample[0]))) 
3

functoinal 방법 :

from operator import add 
from functools import partial 
sample = [(1,3), (4,5), (8,2)] 
result = reduce(partial(map, add), sample) 

result이 프로그램을 실행 한 후 목록 [13, 10] 될 것입니다 암호.

1

큰 데이터 세트에서이 작업을 많이 수행하려는 경우 numpy이 도움이됩니다.

>>> from numpy import * 
>>> sample = [(1,3), (4,5), (8,2)] 
>>> sum(array(sample), axis=1) 
array([ 4, 9, 10]) 
>>> sum(array(sample), axis=0) 
array([13, 10]) 
관련 문제