我似乎在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]
如果我们不关心记忆,解决方案总是可行的。
但主要问题为何会发生这种情况?
答案 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))
)