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

2024-05-16 06:22:11 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我们知道可以用python压缩两个列表,将它们组合成元组。我们可以很容易地再次解析它们。当我多次尝试解析同一个zipped变量时,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]

如果我们不在乎记忆,解决方法总是可能的。你知道吗

但主要的问题是为什么会发生这种情况?你知道吗


Tags: in列表forifzipvariableprintval1
2条回答

zip()返回Python3中的迭代器。根据需要,它一次只从源iterables生成一个元组,当这些元组被迭代时,zip()就没有什么可产生的了。这种方法减少了内存需求,还可以提高性能(特别是在您实际上从未请求过所有压缩元组的情况下)。你知道吗

如果您再次需要相同的序列,可以再次调用zip(),或者将zip()转换为类似list(zip(...))的列表。你知道吗

您还可以使用^{}来创建zip()迭代器的“副本”。但是,在幕后,它存储所有迭代器都没有请求的任何项。如果你要这么做,不妨先用一个列表开始。你知道吗

因为zip函数返回一个iterator。 这种对象只能迭代一次。你知道吗

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

相关问题 更多 >