Python 将成对的列表/元组解压为两个列表/元组
可能重复:Python 将成对的列表/元组解压为两个列表/元组,python,list,tuples,Python,List,Tuples,可能重复: 我有一个如下列表: list = (('1','a'),('2','b'),('3','c'),('4','d')) 我想把这个列表分成两个列表 list1 = ('1','2','3','4') list2 = ('a','b','c','d') 我可以这样做,例如: list1 = [] list2 = [] for i in list: list1.append(i[0]) list2.append(i[1]) 但我想知道是否有更优雅的解决方案 list1
我有一个如下列表:
list = (('1','a'),('2','b'),('3','c'),('4','d'))
我想把这个列表分成两个列表
list1 = ('1','2','3','4')
list2 = ('a','b','c','d')
我可以这样做,例如:
list1 = []
list2 = []
for i in list:
list1.append(i[0])
list2.append(i[1])
但我想知道是否有更优雅的解决方案
list1 = (x[0] for x in source_list)
list2 = (x[1] for x in source_list)
编辑:请注意,zip(*iterable)
是它自己的反义词:
>>> list(source_list) == zip(*zip(*source_list))
True
当解包为两个列表时,将变成:
>>> list1, list2 = zip(*source_list)
>>> list(source_list) == zip(list1, list2)
True
rocksportrocker建议添加。请不要为变量使用内置类型名称。不要叫它
list
。一旦创建了变量list
,就会发生奇怪的事情,因为内置函数list()
现在被变量隐藏了。这是一个元组,而不是列表。在Python中保持它们的直截了当是很重要的,即使它们可以类似地使用。如果您需要实际的列表
s,您可以编制索引,您应该使用方括号[]
而不是圆括号,以使它们列出理解,而不是生成器表达式。-1,使用zip()的解决方案更像是蟒蛇,没有两个loops@naeg,这是一个完全正确的python表达式。你甚至可以为缺乏训练的程序员辩解,这是一个更好的解决方案,而不是使用相当模糊的<代码> zip(*…)语法。@ KiLiangs:嗯,我不认为zip()函数和解包是复杂的还是模糊的?由于zip答案有更多的向上投票,我想其他人也有同样的想法。这取决于原始列表中元组的长度。如果未知或超过2,zip(*)更好,否则,这里的解决方案也很好。对于OP来说,如果您不知道“splat”操作符,这会很有帮助。我想指出,zip(*list\u of_pairs)
的结果不是一对list
而是tuple
。在某些情况下,差异可能很重要(例如附加到它)。因此,示例中的list1
和list2
应该是tuple1
和tuple2
@因果关系绝对正确。我使用了问题中使用的相同名称,它们也是tuple
s。这个错误在最初发布时的一篇评论中被指出:@agf,你说得对。我错过了那个评论。这真是太棒了!拉链是它自己的反面。
>>> list1, list2 = zip(*source_list)
>>> list(source_list) == zip(list1, list2)
True