一份清单中的两笔款项

时间:2013-08-16 17:35:37

标签: python list

我想在列表中获得两个不同值的总和。例如:

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

我希望输出为

13, 10

我可以用几种不同的方式做到这一点。这是我目前的方式:

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

解决这个问题的更多Pythonic方法是什么?

5 个答案:

答案 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 :(得分:3)

功能性方法:

from operator import add
from functools import partial
sample = [(1,3), (4,5), (8,2)]
result = reduce(partial(map, add), sample)
运行此代码后,

result将成为列表[13, 10]

答案 2 :(得分: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很酷。

答案 3 :(得分: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])))

答案 4 :(得分: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])