如何将元组列表解压缩到单个列表中? [复制]
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
基本上是它自己的逆。那样子还挺可爱的。 :)
zip
是 not 它自己的逆。虽然很接近。自身为逆的函数称为对合。 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()
将 1
与 3
配对首先是8
,然后是2
,然后是4
和9
。这些恰好与列或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 的结果仍然适用于我)以上是关于如何将元组列表解压缩到单个列表中? [复制]的主要内容,如果未能解决你的问题,请参考以下文章