如何将元组列表解压缩到单个列表中? [复制]

Posted

技术标签:

【中文标题】如何将元组列表解压缩到单个列表中? [复制]【英文标题】:How to unzip a list of tuples into individual lists? [duplicate] 【发布时间】:2012-10-10 01:57:05 【问题描述】:

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

我有一个元组列表,我想将这个列表解压缩成两个独立的列表。我正在寻找 Python 中的一些标准化操作。

>>> l = [(1,2), (3,4), (8,9)]
>>> f_xxx (l)
[ [1, 3, 8], [2, 4, 9] ] 

我正在寻找一种简洁和 Pythonic 的方式来实现这一点。

基本上,我正在寻找 zip() 函数的逆运算。

【问题讨论】:

zip 基本上是它自己的逆。那样子还挺可爱的。 :) zipnot 它自己的逆。虽然很接近。自身为逆的函数称为对合。 This answer 使用 zip 定义对合。 有实际实现的人吗? 如果你想按 Y 的值对 X 的值进行排序,然后返回两个单独的列表,你可以这样做:y,x= map(list,zip(*sorted(zip(y, x)))) 【参考方案1】:

使用zip(*list):

>>> l = [(1,2), (3,4), (8,9)]
>>> list(zip(*l))
[(1, 3, 8), (2, 4, 9)]

zip() function 将所有输入的元素配对,从第一个值开始,然后是第二个值,依此类推。通过使用 *l 你 apply all tuples in l as separate arguments to the zip() function,所以 zip()13 配对首先是8,然后是2,然后是49。这些恰好与列或l转置对应。

zip() 产生元组;如果您必须有可变列表对象,只需 map() 列表元组或使用列表推导生成列表列表:

map(list, zip(*l))          # keep it a generator
[list(t) for t in zip(*l)]  # consume the zip generator into a list of lists

【讨论】:

聪明....也许太聪明了。任何在没有周围 cmets 的情况下阅读本文的人都会摸不着头脑。 在 Python3 中,这会创建一个 zip 对象。 >>> l = [(1,2), (3,4), (8,9)] >>> zip(*l) <zip at 0x1042d8c48> 可以通过列表理解查看>>> [ii for ii in zip(*l)] [(1, 3, 8), (2, 4, 9)] @amath:不需要列表理解。只需使用list():list(zip(*l)),更快。 小心:如果list 为空,a, b = zip(*list) 将失败,因此您必须将空视为特殊情况。你不会取回两个空元组 - 当然你怎么能?如果这种情况可能发生,那么最好使用列表推导。 @Kapocsi:这很简单;如果需要列表,只需将元组映射到具有列表理解的列表。对于大多数用例,生成序列甚至只是迭代就足够了。【参考方案2】:

如果你想要一个列表列表:

>>> [list(t) for t in zip(*l)]
[[1, 3, 8], [2, 4, 9]]

如果元组列表没问题:

>>> zip(*l)
[(1, 3, 8), (2, 4, 9)]

【讨论】:

我认为map(list, zip(*l)) 在 Python 2.x 中相当不错。无论如何,+1 列表列表选项:) 我更喜欢map之上的列表理解:) @dav1d 有意思,有参考吗? @dav1d -- 这不是真的。 map 与 list-comp 的速度完全取决于问题(您会相对频繁地看到不同人针对不同问题的不同时间)。 map + lambda 通常会比较慢... list-comp 的好处是它在 py2k 和 py3k 中是一样的。 @dav1d -- 这是一个较旧但经典的 post,它显示了相反的结果(在 OS-X 上使用 python2.7 的结果仍然适用于我)

以上是关于如何将元组列表解压缩到单个列表中? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

解压缩python列表时*做啥? [复制]

转置/解压缩功能(zip的倒数)?

python中有没有办法解压缩类似于javascript中的传播运算符的列表? [复制]

将字典列表解压缩到 Pandas 中的单独列中

如何解压缩字符串格式的列表列表?

如何在 Python 中解压缩 RDD 中每个项目的值(列表)?