如何将元组列表解压缩到单个列表中?

Vai*_*hek 219 python tuples list-comprehension list

可能重复:
Python中的转置/解压缩功能

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

>>> l = [(1,2), (3,4), (8,9)]
>>> f_xxx (l)
[ [1, 3, 8], [2, 4, 9] ] 
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种简洁和pythonic的方法来实现这一目标.

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

Mar*_*ers 378

用途zip(*list):

>>> l = [(1,2), (3,4), (8,9)]
>>> list(zip(*l))
[(1, 3, 8), (2, 4, 9)]
Run Code Online (Sandbox Code Playgroud)

zip()功能对向上从所有输入的元件,从所述第一值,则第二等.通过使用*l申请的所有元组中l作为单独的参数zip()函数,所以zip()对向上138第一,然后249.那些恰好与列或者转置相对应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
Run Code Online (Sandbox Code Playgroud)

  • 聪明......也许太聪明了.任何人如果没有周围的评论阅读这篇文章,都会让他们头脑发热 (44认同)
  • @amath:不需要列表理解.只需使用`list()`:`list(zip(*l))`,速度要快得多. (10认同)
  • **注意**:如果`list`为空,`a,b = zip(*list)`将失败,因此你必须将空视为特殊情况.你不会得到两个空元组 - 当然你怎么样?如果发生这种情况,那么使用列表理解会更好. (9认同)
  • 在Python3中,这会创建一个zip对象.`>>> l = [(1,2),(3,4),(8,9)]``>>> zip(*l)``<zip at 0x1042d8c48>`可以用列表查看理解`>>> [ii for zip in zip(*l)]``[(1,3,8),(2,4,9)]`. (3认同)
  • @speedplane:然后将其放入一个函数中并将其命名为 `transpose()`。它并不比许多 `numpy` 或 `pandas` 操作更难读;它有点专业,但做得很好。 (2认同)
  • @Kapocsi:这很简单; 如果需要列表,只需将元组映射到具有列表推导的列表.对于大多数用例,生成序列甚至只是迭代就足够了. (2认同)

小智 82

如果需要列表列表:

>>> [list(t) for t in zip(*l)]
[[1, 3, 8], [2, 4, 9]]
Run Code Online (Sandbox Code Playgroud)

如果元组列表没问题:

>>> zip(*l)
[(1, 3, 8), (2, 4, 9)]
Run Code Online (Sandbox Code Playgroud)

  • 我认为`map(list,zip(*l))`在Python 2.x中相当不错.无论如何,+1列表的选项:) (10认同)
  • @ dav1d - 那不是真的.map与list-comp的速度完全取决于问题(你会看到来自不同人的不同时间对于SO上的不同问题相对频繁).`map` +`lambda`通常比较慢......关于list-comp的好处是它在py2k和py3k中是一样的. (6认同)
  • 我更喜欢上面`map` :)的列表理解 (2认同)