在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
运行多次, append
比zip
快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.