2011-09-26 63 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