为什么python中的zip()变量只能解析一次?

时间:2017-12-19 01:39:22

标签: python

我似乎在Python中发现了一个奇怪的错误,我不知道它是否已经存在或者我做错了什么。请解释一下。

我们知道我们可以在python中压缩两个列表,将它们组合为元组。我们可以再次轻松解析它们。当我试图不止一次地解析相同的压缩变量时,Python似乎没有这样做,它最终给出了空列表[]。它第一次会这样做,但不止一次。

示例:

lis1=[1,2,3,4,5]
lis2=['a','b','a','b','a']
zip_variable=zip(lis1,lis2)
op1=[val2 for (val1,val2) in zip_variable if val1<4]
op2=[val1 for (val1,val2) in zip_variable if val2=='a']
op3=[val1 for (val1,val2) in zip_variable if val2=='b']
print(op1,"\n",op2,"\n",op3)

输出:

['a','b','a']
[]
[]

我有解决方法来修复它,即为同一个zip创建多个变量,如下所示:

lis1=[1,2,3,4,5]
lis2=['a','b','a','b','a']
zip_variable1=zip(lis1,lis2)
zip_variable2=zip(lis1,lis2)
zip_variable3=zip(lis1,lis2)
op1=[val2 for (val1,val2) in zip_variable1 if val1<4]
op2=[val1 for (val1,val2) in zip_variable2 if val2=='a']
op3=[val1 for (val1,val2) in zip_variable3 if val2=='b']
print(op1,"\n",op2,"\n",op3)

输出:

['a','b','a']
[1,3,5]
[2,4]

如果我们不关心记忆,解决方案总是可行的。

但主要问题为何会发生这种情况?

2 个答案:

答案 0 :(得分:3)

zip()在Python 3中返回一个迭代器。它根据需要一次只从源迭代中产生一个元组,当迭代过去时,zip()没有更多的东西可以产生。这种方法可以减少内存需求,也可以提高性能(特别是如果你实际上并没有请求所有的压缩元组)。

如果您需要再次使用相同的序列,请再次拨打zip(),或将zip()转换为list(zip(...))之类的列表。

您还可以使用itertools.tee()创建zip()迭代器的“副本”。但是,在幕后,这将存储所有迭代器未请求的任何项目。如果你打算这样做,你也可以只使用一个列表开始。

答案 1 :(得分:0)

因为zip函数返回iterator。 这种对象只能迭代一次。

如果你想多次迭代相同的zip,我建议你从中创建一个列表或一个元组(list(zip(a, b))tuple(zip(a, b))