Python 中 zip 函数使用生成器对象导致 TypeError: zip argument #2 must support iteration 错误的解决方法
Python 中 zip 函数使用生成器对象导致 TypeError: zip argument #2 must support iteration 错误的解决方法
在使用 Python 的 zip 函数时,如果第二个参数是一个生成器对象,可能会出现 TypeError: zip argument #2 must support iteration 的错误。这是因为 zip 函数需要能够迭代的序列作为参数,而生成器对象并不支持索引访问,无法被 zip 函数迭代。
错误示例:
def a():
aa=[{'code': 'ECONOMY-SPECIAL-N', 'name': '特价经济舱'}, {'code': 'ECONOMY-PROMOTE-N', 'name': '促销经济舱'}, {'code': 'ECONOMY-ADV-DIS-N', 'name': '折扣高经舱'}]
for li in aa:
name=li['code']
plan=li['name']
# print(name,plan)
yield name,plan
def b():
bb=[{'a':1,'bb':11,'c':111},{'a':2,'bb':22,'c':222},{'a':3,'bb':33,'c':222}]
for div in bb:
price1=div['a']
price2=div['bb']
price3=div['c']
# print(price1,price2,price3)
yield price1,price2,price3
def c():
for name,plan,price1,price2,price3 in zip(a(),b()):
wb={
'q':name,'w':plan,'e':price1,'r':price2,'t':price3
}
print(wb)
if __name__ == '__main__':
c()
错误信息:
TypeError: zip argument #2 must support iteration
解决方法:
将 b() 函数的返回值改为一个列表或元组。例如:
def b():
bb=[{'a':1,'bb':11,'c':111},{'a':2,'bb':22,'c':222},{'a':3,'bb':33,'c':222}]
result = []
for div in bb:
price1=div['a']
price2=div['bb']
price3=div['c']
result.append((price1, price2, price3))
return result
修改后的代码:
def a():
aa=[{'code': 'ECONOMY-SPECIAL-N', 'name': '特价经济舱'}, {'code': 'ECONOMY-PROMOTE-N', 'name': '促销经济舱'}, {'code': 'ECONOMY-ADV-DIS-N', 'name': '折扣高经舱'}]
for li in aa:
name=li['code']
plan=li['name']
# print(name,plan)
yield name,plan
def b():
bb=[{'a':1,'bb':11,'c':111},{'a':2,'bb':22,'c':222},{'a':3,'bb':33,'c':222}]
result = []
for div in bb:
price1=div['a']
price2=div['bb']
price3=div['c']
result.append((price1, price2, price3))
return result
def c():
for name,plan,price1,price2,price3 in zip(a(),b()):
wb={
'q':name,'w':plan,'e':price1,'r':price2,'t':price3
}
print(wb)
if __name__ == '__main__':
c()
现在再运行 c() 函数即可。
总结:
zip 函数需要能够迭代的序列作为参数,生成器对象并不支持索引访问,无法被 zip 函数迭代。为了解决此问题,需要将生成器对象的返回值改为一个列表或元组。
原文地址: https://www.cveoy.top/t/topic/mmyU 著作权归作者所有。请勿转载和采集!