2013-08-16 69 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])