通用添加嵌套列表

时间:2016-11-09 17:13:04

标签: python python-2.7

给出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)

3 个答案:

答案 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]]