元组列表总和

时间:2018-10-17 23:41:34

标签: python list tuples list-comprehension

我发现对一个数字列表求和是:

In [9]: l = [[3,7,2],[1,4,5],[9,8,7]]
In [10]: [sum(i) for i in zip(*l)]
Out[10]: [13, 19, 14]

但是我一直在努力寻找一种汇总元组列表以产生元组列表的方法

In [9]: l = [[(1, 1), (1, 1), (1, 1)],[(2, 2), (2, 2), (2, 2)]]
In [10]: [(sum(i[0]), sum(i[1])) for i in zip(*l)] #Did not work

这是我想要的输出:

Out[10]: [(3, 3), (3, 3), (3, 3)]

谢谢!

2 个答案:

答案 0 :(得分:2)

您可以在列表理解中使用tuple理解:

L = [[(1, 1), (1, 1), (1, 1)], [(2, 2), (2, 2), (2, 2)]]

res = [tuple(sum(j) for j in zip(*i)) for i in zip(*L)]

[(3, 3), (3, 3), (3, 3)]

或使用map作为功能更强大的替代方案:

res = [tuple(map(sum, zip(*i))) for i in zip(*L)]

对于较大的列表,您可能希望考虑使用NumPy之类的第三方库,以NumPy术语,您只需要在指定轴上求和即可。

import numpy as np

A = np.array(L)

res = A.sum(axis=0)

array([[3, 3],
       [3, 3],
       [3, 3]])

答案 1 :(得分:1)

您可以先递归展平迭代器

>>> import collections
>>> 
>>> def flatten(l):
...     for el in l:
...         if isinstance(el, collections.Iterable) and not isinstance(el, str):
...             for sub in flatten(el):
...                 yield sub
...         else:
...             yield el
... 
>>> sum(flatten(l))
18

有关flatten的更多详细信息,请参见this link