python中itertools模块zip_longest函数详解

yipeiwu_com6年前Python基础

最近在看流畅的python,在看第14章节的itertools模块,对其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)

相关文章

selenium跳过webdriver检测并模拟登录淘宝

selenium跳过webdriver检测并模拟登录淘宝

简介 模拟登录淘宝已经不是一件新鲜的事情了,过去我曾经使用get/post方式进行爬虫,同时也加入IP代理池进行跳过检验,但随着大型网站的升级,采取该策略比较难实现了。因为你使用get/...

解决Python pandas plot输出图形中显示中文乱码问题

解决方式一: import matplotlib #1. 获取matplotlibrc文件所在路径 matplotlib.matplotlib_fname() #Out[3]: u'...

python同步windows和linux文件

python同步windows和linux文件

写python脚本的初衷,每次在windows编辑完文件后,想同步到linux上去,只能够登录服务器,然后再利用网络copy,重复性很大,就想着能不能写一个小脚本帮我同步。 逻辑:比对本...

Python中浅拷贝copy与深拷贝deepcopy的简单理解

以下是个人对Python深浅拷贝的通俗解释,易于绕开复杂的Python数据结构存储来进行理解! 高级语言中变量是对内存及其地址的抽象,Python的一切变量都是对象。 变量的存...

python调用matplotlib模块绘制柱状图

我们可以调用matplotlib 绘制我们的柱状图,柱状图可以是水平的也可以是竖直的。 在这里我先记录下竖直的柱状图怎么绘制 在这里一般用到的函数就是bar # bar(left,...