2013-10-15 69 views
0

一大串假設我有一個列表,使用Zip功能組合名單

mylist = [[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18]] 

如果我想添加元素的元素,然後我可以用邏輯:

[x+y for x,y in zip(mylist[0],mylist[1],mylist[2],mylist[3],mylist[4],mylist[6]] 

和它會給出列的元素的總和。 但問題是,如果mylist碰巧是1000列表的列表,並且我需要通過元素操作來完成元素,那麼寫入mylist內部zip函數的每個索引都有些尷尬和模糊。

我試着把循環放入zip函數中,但它不起作用。那麼對此有何想法?

它應該像

zip(for k in mylist) # or something else 

感謝

+0

在您的例子,「拉鍊」會給你一個列表6 uples ... – Don

+0

你的例子有一個語法錯誤並在它的邏輯錯誤,只是嘗試運行它。但我認爲你要找的是''zip(* mylist)''。 – fjarri

+0

看看'減少':http://docs.python.org/2/library/functions.html#reduce – Don

回答

2

另一種方法,看起來更加明顯這裏,是使用內置的map沿側zipsum無包裝的名單上

>>> map(sum, zip(*mylist)) 
[51, 57, 63] 

如果你是發電機的風扇,下面可能會增加一些好處

>>> from itertools import izip, imap 
>>> list(imap(sum, izip(*mylist))) 
[51, 57, 63] 
+0

不錯的一個...謝謝 – Ashutosh

3

總之所有的第一要素,所有的第二元素等:

In [2]: [sum(k) for k in zip(*mylist)] 
Out[2]: [51, 57, 63] 

注意,在輸出的每個號碼是總和爲len(mylist)數字:

In [3]: zip(*mylist) 
Out[3]: [(1, 4, 7, 10, 13, 16), (2, 5, 8, 11, 14, 17), (3, 6, 9, 12, 15, 18)] 

The * operator解包mylist以便其項目成爲與zip分開的參數。

+0

爲我工作....我更新了我的代碼..謝謝 – Ashutosh