2014-01-28 78 views
2

假設我有一個包含兩個元素的元組列表和一個(不是元組)列表的列表,例如整數如何將zip列表添加到已壓縮列表中?

a = [('x', 'a'), ('y', 'b'), ('z', 'c')] 
b = [1, 2 ,3] 

我想讓三元素的元組的列表,以便我編寫象下面這樣:

zipped = zip((t[0] for t in a), (t[1] for t in a), b) 
assert zipped == [('x', 'a', 1), ('y', 'b', 2), ('z', 'c', 3)] 

我當前的代碼工作得很好,但我想知道,有沒有更多的高效和優雅的配方,但我的代碼必須迭代和解壓每個元組兩次。 任何人都可以請指教?

回答

7

使用列表理解,元組拆包:

>>> a = [('x', 'a'), ('y', 'b'), ('z', 'c')] 
>>> b = [1, 2 ,3] 
>>> [(x,y,z) for (x,y), z in zip(a, b)] 
[('x', 'a', 1), ('y', 'b', 2), ('z', 'c', 3)] 

>>> a = [('x', 'a'), ('y', 'b'), ('z', 'c')] 
>>> b = [1, 2 ,3] 
>>> [x + (y,) for x, y in zip(a, b)] 
[('x', 'a', 1), ('y', 'b', 2), ('z', 'c', 3)] 
3

一個沒有使用循環,

zip(*(zip(*a)+ [b])) 
+0

無需調用'tuple':'拉鍊(*(ZIP (* a)+ [b]))'也行。順便說一句,這在Python 3.x中不起作用,因爲[Python 3.x中的'zip](http://docs.python.org/3/library/functions.html#zip)返回一個迭代器而不是列表。 – falsetru

+0

是的,的確如此。編輯。謝謝。 –

+0

不使用3.x,但我想你可以使用list()將迭代器轉換爲列表。可能是zip(*(list(zip(* a))+ [b]))應該在那裏工作。 –