2011-09-26 106 views
94

可能重複:
A Transpose/Unzip Function in Python開箱對列表/元組到兩個列表/元組

我有一個看起來像這樣的列表:

我想要分開2個列表中的列表。

list1 = ('1','2','3','4') 
list2 = ('a','b','c','d') 

我可以做到這一點,例如:

list1 = [] 
list2 = [] 
for i in list: 
    list1.append(i[0]) 
    list2.append(i[1]) 

但我想知道是否有一個更優雅的解決方案。

+7

請不要使用變量的內置類型名稱。不要稱之爲「list」。一旦你創建了一個變量'list',你就會開始發生奇怪的事情,因爲內建函數list()現在被你的變量隱藏了。 –

+2

這是一個元組,而不是一個列表。儘管它們可以被類似地使用,但讓它們在Python中保持直線很重要。 –

回答

183
>>> source_list = ('1','a'),('2','b'),('3','c'),('4','d') 
>>> list1, list2 = zip(*source_list) 
>>> list1 
('1', '2', '3', '4') 
>>> list2 
('a', 'b', 'c', 'd') 

編輯:注意zip(*iterable)是其本身的逆:

>>> list(source_list) == zip(*zip(*source_list)) 
True 

開箱成兩份名單,這成爲:

>>> list1, list2 = zip(*source_list) 
>>> list(source_list) == zip(list1, list2) 
True 

加入由rocksportrocker建議。

+5

對於OP,如果您不知道「splat」操作符,那麼http://stackoverflow.com/questions/5239856/foggy-on-asterisk-in-python會很有幫助。 – dicato

+5

我想指出'zip(* list_of_pairs)'的結果不是一對'list',而是'tuple'。在某些情況下差異可能很重要(例如追加到它)。所以這個例子中的'list1'和'list2'應該是'tuple1'和'tuple2'。 – Causality

+0

@因果關係肯定是真的。我在問題中使用了相同的名稱,它們也是'元組'。這個錯誤是在最初發布這個問題時對這個問題的評論中指出的:http://stackoverflow.com/questions/7558908/unpacking-a-list-tuple-of-pairs-into-two-lists-tuples/ 7558990?noredirect = 1#comment9163175_7558908 – agf

17
list1= (x[0] for x in source_list) 
list2= (x[1] for x in source_list) 
+2

如果你需要實際的'list's你可以編制索引,你應該使用方括號'[]'而不是括號來使它們成爲列表解析而不是生成器表達式。 – agf

+0

-1,帶zip()的解決方案更爲pythonic,並且沒有兩個for循環 – naeg

+7

@naeg,這是一個完全正確的pythonic表達式。你甚至可以爭取訓練有素的程序員,這是比使用相當模糊的'zip(* ...)'語法更好的解決方案。 – KillianDS