2012-10-16 23 views
1

在Python中實現以下zip操作是否有更簡潔和更省時的方法?我將清單列表組合在一起製作新清單,如下所示:對Python列表中的列表進行簡潔和快速的zip操作?

>>> a 
[[1, 2, 3], [4, 5, 6]] 
>>> b 
[[10, 11, 12], [13, 14, 15]] 
>>> for x, y in zip(a, b): 
... print zip(*[x, y]) 
... 
[(1, 10), (2, 11), (3, 12)] 
[(4, 13), (5, 14), (6, 15)] 

謝謝。

回答

6

我真的沒有看到其他更好的辦法不是替換:

print zip(*[x, y]) 

有:

print zip(x,y) 

如果你真的有2名元素列表的工作,你很可能只是這樣做:

print zip(a[0], b[0]) 
print zip(a[1], b[1]) 

(它會稍微mor e高效,因爲你離開1 zip,但我不相信它是更多明確,這是你應該真正擔心的)。


如果你真的成緊湊的代碼,你可以使用map

map(zip,a,b) #[[(1, 10), (2, 11), (3, 12)], [(4, 13), (5, 14), (6, 15)]] 

而這又可能會比其他版本更有效,但我覺得你在代碼清晰支付價格略有(儘管其他人可能不同意)。

+0

+1的地圖。 –

+0

@KayZhu - 是的,我不確定是否僅僅因爲你沒有經常看到多個參數'map'而想提及它。既然它不是一個特別熟悉的習慣用法,我猶豫使用它......但我認爲你不會找到一種方法來用較少的字符去做...... – mgilson

+0

是的我會同意我更喜歡現有的代碼而沒有'map'。但很高興知道還有另一個更簡單的方法:) –

2

除了@mgilson所說的,你還可以考慮使用itertools.izip如果你壓縮的列表很大。

由於izip僅在請求時計算元素並且僅返回迭代器,因此對於大型列表,內存使用量遠遠小於zip

3
>>> [zip(i, j) for i, j in zip(a,b)] 
[[(1, 10), (2, 11), (3, 12)], [(4, 13), (5, 14), (6, 15)]] 

當然,這和你上面寫的實際上是一樣的。

1

這工作很順利:

print zip(sum(a,[]),sum(b,[])) 

打印:

[(1, 10), (2, 11), (3, 12), (4, 13), (5, 14), (6, 15)] 

這可能是最好的性能明智和簡潔爲好:

from itertools import chain 
print zip(chain(*a),chain(*b)) 

相同的輸出