Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从元组列表中提取列表_Python_Python 3.x_Tuples - Fatal编程技术网

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!我已将其添加到我的评论中。