Python 如何从元组列表中提取列表
我有这样的元组列表:Python 如何从元组列表中提取列表,python,python-3.x,tuples,Python,Python 3.x,Tuples,我有这样的元组列表: data = [(4, [1, 2]), (10, [3, 13]), (9, [14, 6]), (10, [7, 5]), (19, [2, 7]), (15, [15, 5]), (21, [9, 12]), (250, [11, 11]), (25, [5, 5]), (100, [2, 10]), (120, [8, 11]), ] a = [] b = [] c = [] for i, (j, k) in data: a.appen
data = [(4, [1, 2]),
(10, [3, 13]),
(9, [14, 6]),
(10, [7, 5]),
(19, [2, 7]),
(15, [15, 5]),
(21, [9, 12]),
(250, [11, 11]),
(25, [5, 5]),
(100, [2, 10]),
(120, [8, 11]),
]
a = []
b = []
c = []
for i, (j, k) in data:
a.append(i)
b.append(j)
c.append(k)
如何在不使用循环和迭代的情况下从中获得三个单独的列表,如:
a = [4,10,9,19,...]
b = [1,3,14,7,2,...]
c = [2,13,6,5,7,...]
我对loop的尝试
a=[]
b=[]
c=[]
对于t in数据:
a、 追加(t[0])
b、 追加(t[1][0])
c、 追加(t[1][1])
简单:
a, b, c = zip(*[[x[0], x[1][0], x[1][1]] for x in data])
简单:
a, b, c = zip(*[[x[0], x[1][0], x[1][1]] for x in data])
您基本上希望展开并“解压缩”: 或作为列表:
a, b, c = zip(*[(a,b,c) for a, [b, c] in data])
但老实说,你的循环很好。我可能只是使用它,但要像这样清理它:
data = [(4, [1, 2]),
(10, [3, 13]),
(9, [14, 6]),
(10, [7, 5]),
(19, [2, 7]),
(15, [15, 5]),
(21, [9, 12]),
(250, [11, 11]),
(25, [5, 5]),
(100, [2, 10]),
(120, [8, 11]),
]
a = []
b = []
c = []
for i, (j, k) in data:
a.append(i)
b.append(j)
c.append(k)
编辑
下面是一些计时,我将使用列表理解版本,因为它应该比使用map
更快(没有重复的函数调用开销):
现在,让我们设置一个相当大的数据集来测试:
>>> import timeit
>>> data_big = data * 10_000
>>> print(f'{len(data_big):,d}')
110,000
>>> timeit.timeit(lambda : with_unzip(data_big), number=100)
2.4092896859999655
>>> timeit.timeit(lambda : with_loop(data_big), number=100)
2.0086487390001366
看它的规模不是很大:
>>> data_big = data_big * 100
>>> print(f'{len(data_big):,d}')
11,000,000
>>> timeit.timeit(lambda : with_unzip(data_big), number=10) # made number smaller
27.03781091399992
>>> timeit.timeit(lambda : with_loop(data_big), number=10) # made number smaller
17.5005345510001
这可能是因为a,b,c=zip(*随便什么)
最终会对数据进行两次传递,因为将参数解包到zip
中并不是免费的。如果我们通过缓存.append
方法解析来微优化循环版本,您就可以真正看到这种效果:
>>> def with_loop_microp(data):
... a = []
... b = []
... c = []
... a_append = a.append
... b_append = b.append
... c_append = c.append
... for i, (j, k) in data:
... a_append(i)
... b_append(j)
... c_append(k)
... return a,b,c
...
>>> timeit.timeit(lambda : with_loop_microp(data_big), number=10) # made number smaller
10.746374250000144
您基本上希望展开并“解压缩”: 或作为列表:
a, b, c = zip(*[(a,b,c) for a, [b, c] in data])
但老实说,你的循环很好。我可能只是使用它,但要像这样清理它:
data = [(4, [1, 2]),
(10, [3, 13]),
(9, [14, 6]),
(10, [7, 5]),
(19, [2, 7]),
(15, [15, 5]),
(21, [9, 12]),
(250, [11, 11]),
(25, [5, 5]),
(100, [2, 10]),
(120, [8, 11]),
]
a = []
b = []
c = []
for i, (j, k) in data:
a.append(i)
b.append(j)
c.append(k)
编辑
下面是一些计时,我将使用列表理解版本,因为它应该比使用map
更快(没有重复的函数调用开销):
现在,让我们设置一个相当大的数据集来测试:
>>> import timeit
>>> data_big = data * 10_000
>>> print(f'{len(data_big):,d}')
110,000
>>> timeit.timeit(lambda : with_unzip(data_big), number=100)
2.4092896859999655
>>> timeit.timeit(lambda : with_loop(data_big), number=100)
2.0086487390001366
看它的规模不是很大:
>>> data_big = data_big * 100
>>> print(f'{len(data_big):,d}')
11,000,000
>>> timeit.timeit(lambda : with_unzip(data_big), number=10) # made number smaller
27.03781091399992
>>> timeit.timeit(lambda : with_loop(data_big), number=10) # made number smaller
17.5005345510001
这可能是因为a,b,c=zip(*随便什么)
最终会对数据进行两次传递,因为将参数解包到zip
中并不是免费的。如果我们通过缓存.append
方法解析来微优化循环版本,您就可以真正看到这种效果:
>>> def with_loop_microp(data):
... a = []
... b = []
... c = []
... a_append = a.append
... b_append = b.append
... c_append = c.append
... for i, (j, k) in data:
... a_append(i)
... b_append(j)
... c_append(k)
... return a,b,c
...
>>> timeit.timeit(lambda : with_loop_microp(data_big), number=10) # made number smaller
10.746374250000144
另一个选择是:
a,bc=map(列表,zip(*数据))
b、 c=地图(列表,邮编(*bc))
如果您不关心a
,b
和c
将是元组,您还可以使用:
a,bc=zip(*数据)
b、 c=zip(*bc)
另一个选项是:
a,bc=map(列表,zip(*数据))
b、 c=地图(列表,邮编(*bc))
如果您不关心a
,b
和c
将是元组,您还可以使用:
a,bc=zip(*数据)
b、 c=zip(*bc)
使用循环有什么问题?你基本上想要展平和压缩。@juanpa.arrivillaga这不是解压吗?@Barmar当然,但你可以使用zip来解压使用循环有什么问题?你基本上想要展平和压缩。@juanpa.arrivillaga不是解压吗?@Barmar当然,但是你可以使用zip
解压,不需要使用list
但是我喜欢这个漂亮的catch@juanpa.arrivillaga!我已经修改了代码以反映您的评论。实际上,map
也不是必需的。如果是a,bc=zip(*数据),这可能会成为一个非常简洁的答案;b、 c=zip(*bc)
感谢您的反馈@Tomerikoo!我已将其添加到我的评论中。无需使用列表
,但我喜欢这个漂亮的catch@juanpa.arrivillaga!我已经修改了代码以反映您的评论。实际上,map
也不是必需的。如果是a,bc=zip(*数据),这可能会成为一个非常简洁的答案;b、 c=zip(*bc)
感谢您的反馈@Tomerikoo!我已将其添加到我的评论中。