在Python中将元组列表转换为多个列表

假设我有一个元组列表,我想转换为多个列表。

例如,元组的列表是

[(1,2),(3,4),(5,6),] 

Python中是否有内置函数将其转换为:

 [1,3,5],[2,4,6] 

这可以是一个简单的程序。 但我只是好奇Python中这种内置函数的存在。

内置函数zip()几乎可以做你想做的事情:

 >>> zip(*[(1, 2), (3, 4), (5, 6)]) [(1, 3, 5), (2, 4, 6)] 

唯一的区别是你得到元组而不是列表。 你可以使用它们将它们转换成列表

 map(list, zip(*[(1, 2), (3, 4), (5, 6)])) 

从python文档 :

可以使用zip()和*运算符来解压缩列表:

具体例子:

 >>> zip((1,3,5),(2,4,6)) [(1, 2), (3, 4), (5, 6)] >>> zip(*[(1, 2), (3, 4), (5, 6)]) [(1, 3, 5), (2, 4, 6)] 

或者,如果你真的想要名单:

 >>> map(list, zip(*[(1, 2), (3, 4), (5, 6)])) [[1, 3, 5], [2, 4, 6]] 

使用:

 a = [(1,2),(3,4),(5,6),] b = zip(*a) >>> [(1, 3, 5), (2, 4, 6)] 

添加到Claudiu和Claudiu的答案,因为地图需要从python 3中的itertools导入,您还可以使用列表理解:

 [[*x] for x in zip(*[(1,2),(3,4),(5,6)])] >>> [[1, 3, 5], [2, 4, 6]] 

尽pipe*zip是更Pythonic,下面的代码有更好的性能:

 xs, ys = [], [] for x, y in zs: xs.append(x) ys.append(y) 

另外,当原始列表zs为空时, *zip将会提升,但是这个代码可以正确处理。

我刚刚进行了一个快速实验,结果如下:

 Using *zip: 1.54701614s Using append: 0.52687597s 

运行多次, appendzip快3倍 – 4倍! testing脚本在这里:

 #!/usr/bin/env python3 import time N = 2000000 xs = list(range(1, N)) ys = list(range(N+1, N*2)) zs = list(zip(xs, ys)) t1 = time.time() xs_, ys_ = zip(*zs) print(len(xs_), len(ys_)) t2 = time.time() xs_, ys_ = [], [] for x, y in zs: xs_.append(x) ys_.append(y) print(len(xs_), len(ys_)) t3 = time.time() print('Using *zip:\t{:.8f}s'.format(t2 - t1)) print('Using append:\t{:.8f}s'.format(t3 - t2)) 

我的Python版本:

 Python 3.6.3 (default, Oct 24 2017, 12:18:40) [GCC 4.2.1 Compatible Apple LLVM 8.1.0 (clang-802.0.42)] on darwin Type "help", "copyright", "credits" or "license" for more information.