2016-11-09 44 views
9

鑑於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(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不使用優選的外部庫)

+1

沒有外部庫你的意思是? 'itertools'可能是一個有用的輸入 –

+0

此外 - 它可以推廣到任意級別的嵌套? (不是我的實際問題,但發生在我身上相關) – paulw1128

+0

@ cricket_007謝謝 - 這就是我的意思。我將編輯該問題。 – paulw1128

回答

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()另一種方式是比previouse方法快:

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 
3

這應該工作:

lists = [a,b,c] 
[map(sum,zip(*zipped_lists)) for zipped_lists in zip(*lists)] 
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]]