Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.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中的zip()变量只能解析一次?_Python - Fatal编程技术网

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

为什么python中的zip()变量只能解析一次?,python,Python,我似乎在Python中发现了一个奇怪的bug,我不知道它是否已经存在,或者我正在做的是什么错误。请解释一下 我们知道,我们可以在python中压缩两个列表,将它们组合为元组。我们可以再次轻松地解析它们。当我多次尝试解析同一个压缩变量时,Python似乎没有这样做,它最终给出了空列表[]。第一次它会这样做,但不止一次它不会 例如: lis1=[1,2,3,4,5] lis2=['a','b','a','b','a'] zip_variable=zip(lis1,lis2) op1=[val2 fo

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

我们知道,我们可以在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)
我有一个解决方案,就是为同一个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)
如果我们不关心内存,解决方案总是可能的

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

zip()
在Python3中返回一个迭代器。根据需要,它一次只从源iterables生成一个元组,当这些元组被迭代时,
zip()
将不再产生任何结果。这种方法减少了内存需求,还可以提高性能(特别是如果您实际上从未请求过所有压缩元组)

如果再次需要相同的序列,请再次调用
zip()
,或者将
zip()
转换为类似
list(zip(…)
的列表

您还可以使用创建
zip()
迭代器的“副本”。但是,在后台,它存储所有迭代器都没有请求的任何项。如果要这样做,不妨先使用一个列表。

zip()
在Python3中返回一个迭代器。根据需要,它一次只从源iterables生成一个元组,当这些元组被迭代时,
zip()
将不再产生任何结果。这种方法减少了内存需求,还可以提高性能(特别是如果您实际上从未请求过所有压缩元组)

如果再次需要相同的序列,请再次调用
zip()
,或者将
zip()
转换为类似
list(zip(…)
的列表


您还可以使用创建
zip()
迭代器的“副本”。但是,在后台,它存储所有迭代器都没有请求的任何项。如果您要这样做,您最好使用一个列表作为开始。

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


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

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


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

,因为正如文档所说,
zip()
创建了一个迭代器,而不是一个新的集合。正如你所知,解析和迭代是完全不同的事情。因为,正如文档所说,
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]