我有一个看起来像这样的列表:
我想要分开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])
但我想知道是否有一个更优雅的解决方案。
我有一个看起来像这样的列表:
我想要分开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])
但我想知道是否有一个更优雅的解决方案。
>>> 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建议。
对于OP,如果您不知道“splat”操作符,那么http://stackoverflow.com/questions/5239856/foggy-on-asterisk-in-python会很有帮助。 – dicato
我想指出'zip(* list_of_pairs)'的结果不是一对'list',而是'tuple'。在某些情况下差异可能很重要(例如追加到它)。所以这个例子中的'list1'和'list2'应该是'tuple1'和'tuple2'。 – Causality
@因果关系肯定是真的。我在问题中使用了相同的名称,它们也是'元组'。这个错误是在最初发布这个问题时对这个问题的评论中指出的:http://stackoverflow.com/questions/7558908/unpacking-a-list-tuple-of-pairs-into-two-lists-tuples/ 7558990?noredirect = 1#comment9163175_7558908 – agf
请不要使用变量的内置类型名称。不要称之为“list”。一旦你创建了一个变量'list',你就会开始发生奇怪的事情,因为内建函数list()现在被你的变量隐藏了。 –
这是一个元组,而不是一个列表。尽管它们可以被类似地使用,但让它们在Python中保持直线很重要。 –