Python中itertools模块zip_longest函数详解
本文详解Python标准库itertools中的zip_longest函数,对比其与内置zip函数的差异。zip_longest以最长迭代器为基准,利用fillvalue参数填充较短序列的空缺,确保输出元组长度一致。文章提供了该函数的逻辑实现思路及测试代码示例。
最近在研读《流畅的Python》第14章节,重点学习了itertools模块,并对其内部相关函数的实现逻辑进行了深入分析。
关于zip_longest(it_obj1, ..., it_objN, fillvalue=None)函数,其核心功能与内置的zip函数类似,均用于将多个迭代器中的元素进行一一对应组合。
区别在于,内置zip函数以元素最少的迭代器为基准进行截断,而zip_longest则以元素最多的迭代器为基准,并使用fillvalue指定的值来填充较短迭代器缺失的部分。
以下总结了该函数的一种大致实现方法,该逻辑与官方实现细节不同,但能体现其核心思想。
实现思路主要包含三步:首先找出元素个数最多的迭代器;其次计算各迭代器与最大元素个数的差值;最后向元素较少的对象中填充相应数量的元素,使其长度一致。
def zip_longest(*it, **kwargs):
its = {k: len(k) for k in it} # 这里我是用字典把参数对象和参数的元素个数结果作为一个字典
max_num = max(its.values()) # 确定迭代对象元素最大值
result = [] #
fillvalue = kwargs.get('fillvalue', None) # 元素较少的填充值
for x in range(max_num): # 已最大次为基准循环
result = []
for it in its: # 循环所有迭代对象,以便进行填充数据
element = list(it) # 将
if len(it) < max_num: # 如果迭代对象的元素个数比最大值小,则要填充数据
for i in range(max_num - len(it)): # 此为要填充数据的个数
element.append(fillvalue) # 填充操作,完成后所有的迭代对象的元素个数都为一致
result.append(element[x]) # 生成一一对应结果,存放到list中
yield tuple(result) # 将结果输出
通过以下代码测试该函数的执行结果:
res = zip_longest('abc', '12')
for x in res:
print(x)
运行后的输出结果为:
('a', '1') ('b', '2') ('c', None)
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













