Python中如何在不转为可迭代对象的情况下拼接map对象?
解决方案
要在不将y1和y2显式转换为列表、元组等可迭代对象的前提下拼接这两个map迭代器,最直接的方法是使用Python标准库中的itertools.chain()函数,它支持惰性拼接多个迭代器,不会提前消耗原迭代器的元素。
代码示例
import itertools def square(x): return x**2 def cube(x): return x**3 in1 = [0, 2, 3] in2 = [2, 1, 9] y1 = map(square, in1) y2 = map(cube, in2) # 拼接两个map迭代器 combined_iterator = itertools.chain(y1, y2) # 遍历拼接后的迭代器(此时才会实际执行map的计算) for val in combined_iterator: print(val)
原理说明
itertools.chain()接收任意数量的可迭代对象(包括迭代器)作为参数,返回一个全新的迭代器。- 这个新迭代器会按顺序遍历每个输入迭代器的元素:先耗尽
y1的所有元素,再继续遍历y2,全程都是惰性计算,不会提前把y1或y2的元素一次性加载到内存中,完全满足“不显式转换”的要求。
自定义实现(可选)
如果不想依赖标准库,也可以自己写一个简单的生成器函数来实现相同的逻辑:
def chain_iterators(*iterators): for it in iterators: yield from it combined_iterator = chain_iterators(y1, y2)
这个生成器函数会逐个遍历传入的迭代器,并用yield from输出每个迭代器的元素,同样是惰性处理,效果和itertools.chain()一致。
内容的提问来源于stack exchange,提问作者Barzi2001
相关产品推荐
相关产品推荐

