给出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]]
Run Code Online (Sandbox Code Playgroud)
我可以将这些向量与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]]
Run Code Online (Sandbox Code Playgroud)
我已经手动扩展了这两个列表,但是有一种pythonic方法来概括它来处理任意数量的列表吗?
(Python 2.7不使用外部库首选)
这是一个通用方法:
\n\nfrom itertools import izip\ndef multiple_sum(*args):\n return [map(sum, izip(*items)) for items in izip(*args)] \nRun Code Online (Sandbox Code Playgroud)\n\n演示:
\n\nIn [13]: multiple_sum(a, b, c)\nOut[13]: [[111, 222, 333], [444, 555, 666], [777, 888, 999]]\nRun Code Online (Sandbox Code Playgroud)\n\n请注意,由于在 Python 2.7 中zip返回一个列表,因此当您只想迭代结果时最好使用它,而不是使用itertools.izip返回迭代器。
这是另一种使用方法itertools.starmap()这是另一种比以前的方法更快的
def multiple_sum(*args):\n return [map(sum, lst) for lst in starmap(zip, zip(*args))]\nRun Code Online (Sandbox Code Playgroud)\n\n基准:
\n\nIn [32]: %timeit [map(sum, izip(*items)) for items in izip(a, b, c)]\n100000 loops, best of 3: 3.93 \xc2\xb5s per loop\n\nIn [33]: %timeit [map(sum, lst) for lst in starmap(zip, zip(a, b , c))]\n100000 loops, best of 3: 3.01 \xc2\xb5s per loop\nRun Code Online (Sandbox Code Playgroud)\n