当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《转置/解压缩功能(zip的反转)?》经验,为你挑选了5个好方法。

我有一个2项元组的列表,我想将它们转换为2个列表,其中第一个包含每个元组中的第一个项目,第二个列表包含第二个项目.

例如:

original = [('a', 1), ('b', 2), ('c', 3), ('d', 4)]
# and I want to become...
result = (['a', 'b', 'c', 'd'], [1, 2, 3, 4])

是否有内置函数可以做到这一点?



1> Patrick..:

zip是它自己的逆!如果您使用特殊*运算符.

>>> zip(*[('a', 1), ('b', 2), ('c', 3), ('d', 4)])
[('a', 'b', 'c', 'd'), (1, 2, 3, 4)]

这种方式的工作方式是zip使用参数调用:

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

...除了参数zip直接传递给(在转换为元组之后),所以不必担心参数的数量太大.


@Tommy这是不正确的.`zip`在Python 3中的工作方式完全相同,只是它返回迭代器而不是列表.为了得到与上面相同的输出,你只需要将zip调用包装在一个列表中:`list(zip(*[('a',1),('b',2),('c',3 ),('d',4)]))`将输出`[('a','b','c','d'),(1,2,3,4)]`
哦,如果只是这么简单.解压缩`zip([],[])`这种方式不会让你`[],[]`.它会让你`[]`.要是...
这在Python3中不起作用.请参阅:http://stackoverflow.com/questions/24590614/python3-unzipping-a-list-of-tuples
注意:您可以通过很长的列表来解决内存和性能问题.
@cdhagmann:现在尝试使用`list1 = []; list2 = []`。

2> Anders Euren..:

你也可以这样做

result = ([ a for a,b in original ], [ b for a,b in original ])

应该更好地扩展.特别是如果Python不擅长扩展列表推导,除非需要.

(顺便说一句,它产生了一个2元组(对)列表,而不是像元组列表那样zip.)

如果生成器而不是实际列表都可以,那么这样做:

result = (( a for a,b in original ), ( b for a,b in original ))

在您询问每个元素之前,生成器不会遍历列表,但另一方面,它们会保留对原始列表的引用.


这不比'zip(*x)`版本"扩展得更好".`zip(*x)`只需要一次遍历循环,并且不会使用堆栈元素.
你希望得到的是一个生成器表达 - 它已经存在.
"特别是如果Python不擅长扩展列表推导,除非需要." 嗯...通常,列表理解会立即扩展 - 或者我是否出错了?

3> 小智..:

如果您的列表长度不同,则可能不希望按照Patricks的说法使用zip.这有效:

>>> zip(*[('a', 1), ('b', 2), ('c', 3), ('d', 4)])
[('a', 'b', 'c', 'd'), (1, 2, 3, 4)]

但是使用不同的长度列表,zip会将每个项目截断为最短列表的长度:

>>> zip(*[('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', )])
[('a', 'b', 'c', 'd', 'e')]

您可以使用没有函数的map来填充空结果,而不是:

>>> map(None, *[('a', 1), ('b', 2), ('c', 3), ('d', 4), ('e', )])
[('a', 'b', 'c', 'd', 'e'), (1, 2, 3, 4, None)]

zip()虽然略快.


你也可以使用`izip_longest`
有趣的是,你能解释一下`map`是如何工作的吗?
对于python3用户称为"zip_longest".

4> wassimans..:

我喜欢zip(*iterable)在我的程序中使用(这是你正在寻找的代码段),如下所示:

def unzip(iterable):
    return zip(*iterable)

我发现unzip更具可读性.



5> Noyer282..:
>>> original = [('a', 1), ('b', 2), ('c', 3), ('d', 4)]
>>> tuple([list(tup) for tup in zip(*original)])
(['a', 'b', 'c', 'd'], [1, 2, 3, 4])

在问题中给出一个列表元组.

list1, list2 = [list(tup) for tup in zip(*original)]

解压缩两个列表.

推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有