Python中基于字典生成的zip对象第二次转为列表返回空列表的原因咨询
为什么Python中zip对象第二次转列表会返回空?
嗨,这个问题的根源其实是Python里迭代器的特性,咱们来拆解一下:
首先先看你给出的代码:
l1= {'a':6, 'b':5, 'c':3, 'd':2, 'e':1, 'f':7, 'g':4, 'h':9} l2={'a':7, 'b':5, 'c':2, 'd':3, 'e':8} z=zip(l1.values(),l2.values()) print(list(z)) #此处输出正确结果 print(list(z)) #此处返回空列表,原因是什么?
运行后得到的输出是:
[(6, 7), (5, 5), (3, 2), (2, 3), (1, 8)]
[]
原因解析
Python里的zip()函数返回的是一个迭代器(iterator),而迭代器有个关键特性:它只能被遍历一次。
当你第一次调用list(z)时,Python会遍历这个迭代器,把里面所有的元素都取出来转换成列表,这时候迭代器的"指针"已经走到了末尾,没有剩余元素了。当你第二次再调用list(z)时,迭代器已经没有元素可以提供了,自然就返回空列表。
简单说就是:迭代器是"一次性"的,用完就空了,不会保存之前的元素。
解决办法
如果需要多次使用zip后的结果,有两种常用方案:
- 提前转换成列表保存
把zip对象直接转成列表存在变量里,之后直接复用这个列表即可:
l1= {'a':6, 'b':5, 'c':3, 'd':2, 'e':1, 'f':7, 'g':4, 'h':9} l2={'a':7, 'b':5, 'c':2, 'd':3, 'e':8} z_result = list(zip(l1.values(), l2.values())) print(z_result) # 输出正常结果 print(z_result) # 再次输出同样内容
- 每次需要时重新生成zip对象
如果原字典的数据没有变化,每次需要的时候重新调用zip()生成新的迭代器:
l1= {'a':6, 'b':5, 'c':3, 'd':2, 'e':1, 'f':7, 'g':4, 'h':9} l2={'a':7, 'b':5, 'c':2, 'd':3, 'e':8} print(list(zip(l1.values(), l2.values()))) # 第一次生成并遍历 print(list(zip(l1.values(), l2.values()))) # 重新生成新的zip对象,正常输出
内容的提问来源于stack exchange,提问作者Arpit
相关产品推荐
相关产品推荐

