我想要列出兩個不同值的總和。例如:來自一個列表的兩個總和
sample = [(1,3), (4,5), (8,2)]
我想輸出是
13, 10
我能做到這一點在幾個不同的方式。以下是我目前的方式:
t1 = 0
t2 = 0
for item1, item2 in sample:
t1 += item1
t2 += item2
什麼是Pythonic更好的解決方法?
我想要列出兩個不同值的總和。例如:來自一個列表的兩個總和
sample = [(1,3), (4,5), (8,2)]
我想輸出是
13, 10
我能做到這一點在幾個不同的方式。以下是我目前的方式:
t1 = 0
t2 = 0
for item1, item2 in sample:
t1 += item1
t2 += item2
什麼是Pythonic更好的解決方法?
你可以試試這個:
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]
我認爲'itertools.izip'會更好,因爲'zip'仍然需要有效的雙循環,這是OP想要避免的。 –
在這種情況下,第三個例子看起來很理想,謝謝。 –
@SilasRay感謝您指出'itertools.izip'。我已經改變了使用它的例子。 – FastTurtle
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的是涼爽。
一個班輪:
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])))
一個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]
運行此之後碼。
如果你打算做很多事情(在大數據集上),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])
您的替代代碼實際上不起作用。 'sample [0] ==(1,3)'。 – user2357112
啊,很好。你是對的,我會把這個例子拉出來。 –