给出3个嵌套向量:
>>> a
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> b
[[10, 20, 30], [40, 50, 60], [70, 80, 90]]
>>> c
[[100, 200, 300], [400, 500, 600], [700, 800, 900]]
我可以将这些向量与map / sum / zip理解一起添加,如下所示:
>>> [map(sum,zip(i,j,k)) for i,j,k in zip(a,b,c)]
[[111, 222, 333], [444, 555, 666], [777, 888, 999]]
我已经手动扩展了这两个列表,但是有一种pythonic方法来概括这个以处理任意数量的列表吗?
(不使用外部库的Python 2.7)
答案 0 :(得分:4)
以下是一般方法:
from itertools import izip
def multiple_sum(*args):
return [map(sum, izip(*items)) for items in izip(*args)]
演示:
In [13]: multiple_sum(a, b, c)
Out[13]: [[111, 222, 333], [444, 555, 666], [777, 888, 999]]
请注意,因为在Python 2.7中zip
返回一个列表,所以当你只想迭代结果时,最好使用它,而是使用返回迭代器的itertools.izip
。
以下是使用itertools.starmap()
的另一种方法,它比前一种方法更快:
def multiple_sum(*args):
return [map(sum, lst) for lst in starmap(zip, zip(*args))]
基准:
In [32]: %timeit [map(sum, izip(*items)) for items in izip(a, b, c)]
100000 loops, best of 3: 3.93 µs per loop
In [33]: %timeit [map(sum, lst) for lst in starmap(zip, zip(a, b , c))]
100000 loops, best of 3: 3.01 µs per loop
答案 1 :(得分:3)
这应该有效:
lists = [a,b,c]
[map(sum,zip(*zipped_lists)) for zipped_lists in zip(*lists)]
答案 2 :(得分:3)
如果您有列表清单([a,b,c]
),则可以执行以下操作:
>>> lists = [a,b,c]
>>> [map(sum, zip(*l)) for l in zip(*lists)]
[[111, 222, 333], [444, 555, 666], [777, 888, 999]]