可迭代对象就像密闭容器里的水,有货倒不出

itertools 是 python 内置的标准模块,提供了很多简洁又高效的专用功能,使用得当能够极大的简化代码行数,同时所有方法都是实现了生成器函数,这就意味着极大的节省内存。

itertools 提供的功能主要分为三大块,以最新版本的 3.10 为例:

  1. 对可迭代对象无限迭代,无限输出

  2. 对可迭代对象有限迭代

  3. 对可迭代对象排列组合

方法如下:

导入包

>>> from iteratortools import *

复制代码

无限迭代

iteratortools.count(start=0, step=1)

数值生成器,可以指定起始位置和步长,并且步长可以为浮点数。无限输出,一直累加,在例子中需要边睡眠 1s 边输出。

>>> import time>>> iterator = count(4, 0.5)>>> for i in iterator:...     print(i)...     time.sleep(1)...44.55.05.56.06.57.07.5

复制代码

iteratortools.cycle(iteratorable) 无限循环取出可迭代对象里的元素

>>> a = cycle("ABCD")>>> import time>>> for i in a:...     print(i)...     time.sleep(1)...ABCDABCD

复制代码

iteratortools.repeat(object[, times]) 不断重复输出整个 object,如果指定了重复次数,则输出指定次数,否则将无限重复。

>>> iterator = repeat('hello world', 10)>>>>>> for i in iterator:...     print(i)...hello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello worldhello world有了这个神器,对输出10次hello world这种问题又有一种新解法

复制代码

有限迭代

iteratortools.accumulate(iteratorable[, func, *, initial=None]) 返回对列表中元素逐项的操作,操作有:

  1. 累加,返回累加到每一项的列表

  2. 累乘,返回累乘到每一项的列表

  3. 最小值,返回到当前项的最小值

  4. 最大值,返回到当前项的最大值

>>> [2, 4, 8, 1, 3, 5][2, 4, 8, 1, 3, 5]>>> arr = [2, 4, 8, 1, 3, 5]>>>>>> add = accumulate(arr)>>>>>> list(add)[2, 6, 14, 15, 18, 23]>>>>>> max = accumulate(arr, max)>>> list(max)[2, 4, 8, 8, 8, 8]>>>>>> import operator>>> mul = accumulate(arr, operator.mul)>>> list(mul)[2, 8, 64, 64, 192, 960]>>>>>> min = accumulate(arr, min)>>> list(min)[2, 2, 2, 1, 1, 1]

复制代码

iteratortools.chain(*iteratorables) 将多个可迭代对象构建成一个新的可迭代对象,统一返回。类似于将多个对象链成一条串

>>> iterator = chain([1,2,3],['a','b','c'],(5,6,7))>>> list(iterator)[1, 2, 3, 'a', 'b', 'c', 5, 6, 7]

复制代码

优点:可以将多个可迭代对象整合成一个,避免逐个取值

chain.from_iteratorable(iteratorable) 将一个迭代对象中将所有元素类似于 chain 一样,统一返回。

>>> chain.from_iteratorable(['abc','def'])<iteratortools.chain object at 0x1083ae460>>>> iterator = chain.from_iteratorable(['abc','def'])>>> list(iterator)['a', 'b', 'c', 'd', 'e', 'f']

复制代码

iteratortools.compress(data, selectors) 按照真值表筛选元素

>>> arr = [1,2,3,4]>>> selectors = [1,0,1,0]>>>>>> iterator = compress(arr, selectors)>>>>>> list(iterator)[1, 3]

复制代码

iteratortools.dropwhile(predicate, iteratorable) 按照条件筛选,丢弃掉第一次不符合条件时之前的所有元素

>>> arr = [1,2,3,2,1,2,1]>>> iterator = dropwhile(lambda x: x<3, arr)>>> list(iterator)[3, 2, 1, 2, 1]

复制代码

iteratortools.takewhile(predicate, iteratorable)

根据 predicate 条件筛选可迭代对象中的元素,只要元素为真就返回,第一次遇到不符合的条件就退出。

按照条件筛选,丢弃第一次遇到不符合条件之后的元素。行为类似于上一个 dropwhile,区别在于丢弃的选择不同。

iteratortools.filterfalse(predicate, iteratorable) 保留不符合条件的元素,返回迭代器

>>> arr = [1,2,3,4,5]>>> iterator = filterfalse(lambda x:x<3, arr)>>> list(iterator)[3, 4, 5]

复制代码

iteratortools.groupby(iteratorable, key=None) 按照指定的条件分类。输出条件和符合条件的元素

>>> iterator = groupby(arr, lambda x: x>3)>>> for condition ,numbers in iterator:...     print(condition, list(numbers))...False [1, 2, 3]True [4, 5]

复制代码

iteratortools.islice(iteratorable, start, stop[, step]) 对迭代器进行切片,老版本中不能指定 start 和 stop 以及步长,新版本可以。

>>> iterator = count()>>> slice_iterator = islice(iterator, 10, 20, 2)>>> list(slice_iterator)[10, 12, 14, 16, 18]

复制代码

iteratortools.starmap(function, iteratorable) 将 function 作用于可迭代对象上,类似于 map 函数

iteratortools.tee(iteratorable, n=2) 从一个可迭代对象中返回 n 个独立的迭代器

>>> iterator = tee(arr)>>> for i in iterator:...     print(type(i), list(i))...<class 'iteratortools._tee'> [1, 2, 3, 4, 5]<class 'iteratortools._tee'> [1, 2, 3, 4, 5]

复制代码

iteratortools.zip_longest(*iteratorables, fillvalue=None)

创建一个迭代器,从每个可迭代对象中收集元素。如果可迭代对象的长度未对齐,将根据 fillvalue 填充缺失值。

迭代持续到耗光最长的可迭代对象。大致相当于:

>>> iterator = zip_longest("ABCD", "xy", fillvalue="-")>>> list(iterator)[('A', 'x'), ('B', 'y'), ('C', '-'), ('D', '-')]

复制代码

排列组合迭代

iteratortools.product(*iteratorables, repeat=1)

生成多个可迭代对象的笛卡尔积

大致相当于生成器表达式中的嵌套循环。例如, product(A, B) 和 ((x,y) for x in A for y in B) 返回结果一样。

>>> iterator = product("123", "abc")>>> list(iterator)[('1', 'a'), ('1', 'b'), ('1', 'c'), ('2', 'a'), ('2', 'b'), ('2', 'c'), ('3', 'a'), ('3', 'b'), ('3', 'c')]

复制代码

将可选参数 repeat 设定为要重复的次数。例如,product(A, repeat=4) 和 product(A, A, A, A) 是一样的

iteratortools.permutations(iteratorable, r=None) 由 iteratorable 元素生成长度为 r 的排列。元素的排列,类似于给一个[1,2,3],选取其中两个元素,一共有多少种组合方法?不要求元素排列之后的位置。

>>> iter = permutations([1,2,3], r=3)>>> list(iterator)[(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]

复制代码

这个方法能够完美解决算法中的全排列问题,简直是量身定做。如果早知道这么简单,当年考算法也不会。。,哎

可参见 leetcode46 题: 力扣

iteratortools.combinations(iteratorable, r) 返回由输入 iteratorable 中元素组成长度为 r 的子序列。元素不可重复使用。子序列是要求元素在排列之后和之前的相对位置不变的。1,2,3 中 3 在 1 的后面,子序列中 3 也一定在 1 的后面。

>>> iterator = combinations([1,2,3,4], r = 3)>>> list(iterator)[(1, 2, 3), (1, 2, 4), (1, 3, 4), (2, 3, 4)]>>> iterator = combinations([1], r = 3)>>> list(iterator)[]

复制代码

这个方法可以曲线解决组合总数问题

力扣

iteratortools.combinations_with_replacement(iteratorable, r) 返回由输入 iteratorable 中元素组成的长度为 r 的子序列,允许每个元素可重复出现

>>> iter = combinations_with_replacement([1,2,3,4], r=2)>>> list(iter)[(1, 1), (1, 2), (1, 3), (1, 4), (2, 2), (2, 3), (2, 4), (3, 3), (3, 4), (4, 4)]
>>> iterator = combinations_with_replacement([1], r=3)>>> list(iterator)[(1, 1, 1)]

复制代码

原文链接:http://www.cnblogs.com/goldsunshine/p/15678828.html

作者:goldsunshine

Python 自带性能强悍的标准库 itertools相关推荐

  1. python自带性能强悍的标准库 itertools

    可迭代对象就像密闭容器里的水,有货倒不出 itertools是python内置的标准模块,提供了很多简洁又高效的专用功能,使用得当能够极大的简化代码行数,同时所有方法都是实现了生成器函数,这就意味着极 ...

  2. Python使用标准库itertools中count类求解数苹果问题

    问题描述:有一箱苹果, 4 个 4 个地数最后余下 1 个, 5 个 5 个地数最后余下 2 个, 9 个 9 个地数最后余下 7 个.编写程序计算这箱苹果至少有多少个. 解题思路:先确定除以 9 余 ...

  3. python 标准库itertools,对于迭代器的一些妙手

    python标准库itertools模块,真的好用,之前做变量衍生的时候要做笛卡尔积,如果知道这个函数,应该可以节省不少功夫,我这里简单写了几个方法,感兴趣的也可以参考一下官方文档看看,这里放一下3. ...

  4. python 删除csv第一行_python 标准库学习之 csv

    本文由作者 凭海临风 授权刊登.原文地址:https://jeffsui.github.io/2020/01/02/python-standard-library-csv/ 文档路径 官方文档:htt ...

  5. python random包含尾部吗_Python标准库random的方法randint(m,n)用来生成一个[m,n]区间上的随机整数。...

    [判断题]已知列表 x = [1, 2, 3],那么执行语句 x = 3 之后,变量x的地址不变 [判断题]只能对列表进行切片操作,不能对元组和字符串进行切片操作 [单选题]Which is not ...

  6. python中wraps_python 装饰器及标准库functools中的wraps

    最近在看 flask的视图装饰器 时,忽然想起预(复)习一下python的装饰器. 这里有一篇比较好的讲解装饰器的书写的 Python装饰器学习(九步入门) . 这里不单独记录装饰器的书写格式了,重点 ...

  7. python的input()函数与getpass标准库

    1. input()函数给我们提供了从键盘输入数据的途径,我们经常用这个函数来读入用户名等一些可以明文显示的数据.但是对于像密码这样的要密文显示的场景,这个函数就显得不安全了.因此python也给我们 ...

  8. python守护进程进程池_Python3标准库:multiprocessing像线程一样管理进程

    Python Python开发 Python语言 Python3标准库:multiprocessing像线程一样管理进程 1. multiprocessing像线程一样管理进程 multiproces ...

  9. Python学习笔记011_模块_标准库_第三方库的安装

    容器 -> 数据的封装 函数 -> 语句的封装 类 -> 方法和属性的封装 模块 -> 模块就是程序 , 保存每个.py文件 # 创建了一个hello.py的文件,它的内容如下 ...

  10. python学习笔记(十)标准库pprint

    引用的方式 不仅使标准库的模块,所有模块都服从下述引用方式. 最基本的.也是最常用的,还是可读性非常好的: import modulename 例如: >>> import ppri ...

最新文章

  1. 六层感知神经网络系统
  2. C++后台开发需要什么?
  3. CPP中的this指针
  4. c语言点阵字符,点阵的汉字程序
  5. 【LeetCode】剑指 Offer 14. 剪绳子
  6. 大数据该如何运行与分析
  7. 线性代数学习笔记8-1:复数矩阵与共轭转置、Hermite矩阵、酉矩阵、傅里叶矩阵和快速傅里叶变换FFT
  8. oracle11g监听配置访问QA
  9. 侧方位停车技巧图解 教你快速便捷停车(图)
  10. 在美国读博士的那七年
  11. GitHub + PicUloader + jsDelivr : 通过 web 上传的免费图床和图像访问 CDN 加速
  12. python atm作业详解_Python小案例--ATM系统
  13. 如何通过企业微信、飞书、钉钉消息通知接收双因子认证动态密码?
  14. 理解围绕软件技术标准的上层动机和力量
  15. 如何实现登录互踢 即如何实现当用户登录之后 如果在其他地方再次登录 则这边的用户自动退出系统...
  16. PHP7的session无法使用memcache
  17. 基于安卓的健康体检预约系统APP—计算机毕业设计
  18. H3C_S5500配置DHCP服务
  19. 【C#本质论 二】数据类型
  20. 嵌入式linux之go语言开发(九)关于嵌入式GUI

热门文章

  1. 快逸报表(润乾报表使用)(v4 版本)
  2. OpenCV身份证离线识别技术实战(一)
  3. python安装包错误的问题
  4. mnist数据集下载——mnist数据集提供百度网盘下载地址
  5. dump文件 linux,linux使用MAT分析dump文件
  6. win10同步服务器文件夹,和彩云如何设置同步文件夹?
  7. 小米球Ngrok-使用方法
  8. 2021华为软挑初探——代码实现
  9. linux grep -v多个关键字,Linux grep 命令详解
  10. 省市区三级联动 mysql_javaweb--json--ajax--mysql实现省市区三级联动(附三级联动数据库)...