【问题标题】:Unpacking a list / tuple of pairs into two lists / tuples将一对列表/元组解压缩为两个列表/元组
【发布时间】:2011-11-25 09:53:59
【问题描述】:

可能重复:
A Transpose/Unzip Function in Python

我有一个如下所示的列表:

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

我想将列表分成 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])

但我想知道是否有更优雅的解决方案。

【问题讨论】:

  • 请不要对变量使用内置类型名称。不要称它为list。一旦你创建了一个变量list,你就会开始有奇怪的事情发生,因为内置函数list()现在被你的变量隐藏了。
  • 这是一个元组,而不是一个列表。在 Python 中直接使用它们很重要,即使它们可以类似地使用。

标签: python list tuples


【解决方案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”运算符,stackoverflow.com/questions/5239856/foggy-on-asterisk-in-python 会很有帮助。
  • 我想指出zip(*list_of_pairs)的结果不是一对list而是tuple。在某些情况下,差异可能很重要(例如附加到它)。所以示例中的list1list2 应该是tuple1tuple2
  • @Causality 绝对正确。我使用了问题中使用的相同名称,它们也是tuples。最初发布此问题时,在对问题的评论中指出了该错误:stackoverflow.com/questions/7558908/…
  • @agf,你是对的。我错过了那条评论。
  • 这太棒了! zip 是它自己的反向。
【解决方案2】:
list1 = (x[0] for x in source_list)
list2 = (x[1] for x in source_list)

【讨论】:

  • 如果您需要实际的 lists 可以索引,您应该使用方括号 [] 而不是括号,以使它们成为列表推导而不是生成器表达式。
  • -1,使用 zip() 的解决方案更符合 Python 风格,没有两个 for 循环
  • @naeg,这是一个完全正确的 Python 表达式。您甚至可以为训练不足的程序员争论这是一个比使用相当模糊的zip(*...) 语法更好的解决方案。
  • @KillianDS:嗯,我不认为 zip() 函数和解包参数是复杂或模糊的?由于 zip-answer 有更多的赞成票,我想其他人也有同样的想法。
  • 这取决于原始列表中元组的长度。如果未知或超过2,则zip(*)更好,否则,这里的解决方案也很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-26
  • 2020-12-11
  • 2015-08-24
  • 2014-07-13
  • 2011-06-17
  • 2019-06-16
相关资源
最近更新 更多