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 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录