我发现对一个数字列表求和是:
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)]
谢谢!
答案 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。