Python中itertools模块zip_longest函数详解

Owen
Owen
发布时间:2026-10-13 | 2人浏览过
原创

本文详解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)

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表