Python 自带性能强悍的标准库 itertools
可迭代对象就像密闭容器里的水,有货倒不出
itertools 是 python 内置的标准模块,提供了很多简洁又高效的专用功能,使用得当能够极大的简化代码行数,同时所有方法都是实现了生成器函数,这就意味着极大的节省内存。
itertools 提供的功能主要分为三大块,以最新版本的 3.10 为例:
对可迭代对象无限迭代,无限输出
对可迭代对象有限迭代
对可迭代对象排列组合
方法如下:
导入包
>>> 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)
...
4
4.5
5.0
5.5
6.0
6.5
7.0
7.5
复制代码
iteratortools.cycle(iteratorable)
无限循环取出可迭代对象里的元素
>>> a = cycle("ABCD")
>>> import time
>>> for i in a:
... print(i)
... time.sleep(1)
...
A
B
C
D
A
B
C
D
复制代码
iteratortools.repeat(object[, times])
不断重复输出整个 object,如果指定了重复次数,则输出指定次数,否则将无限重复。
>>> iterator = repeat('hello world', 10)
>>>
>>> for i in iterator:
... print(i)
...
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
hello world
有了这个神器,对输出10次hello world这种问题又有一种新解法
复制代码
有限迭代
iteratortools.accumulate(iteratorable[, func, *, initial=None])
返回对列表中元素逐项的操作,操作有:
累加,返回累加到每一项的列表
累乘,返回累乘到每一项的列表
最小值,返回到当前项的最小值
最大值,返回到当前项的最大值
>>> [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相关推荐
- python自带性能强悍的标准库 itertools
可迭代对象就像密闭容器里的水,有货倒不出 itertools是python内置的标准模块,提供了很多简洁又高效的专用功能,使用得当能够极大的简化代码行数,同时所有方法都是实现了生成器函数,这就意味着极 ...
- Python使用标准库itertools中count类求解数苹果问题
问题描述:有一箱苹果, 4 个 4 个地数最后余下 1 个, 5 个 5 个地数最后余下 2 个, 9 个 9 个地数最后余下 7 个.编写程序计算这箱苹果至少有多少个. 解题思路:先确定除以 9 余 ...
- python 标准库itertools,对于迭代器的一些妙手
python标准库itertools模块,真的好用,之前做变量衍生的时候要做笛卡尔积,如果知道这个函数,应该可以节省不少功夫,我这里简单写了几个方法,感兴趣的也可以参考一下官方文档看看,这里放一下3. ...
- python 删除csv第一行_python 标准库学习之 csv
本文由作者 凭海临风 授权刊登.原文地址:https://jeffsui.github.io/2020/01/02/python-standard-library-csv/ 文档路径 官方文档:htt ...
- python random包含尾部吗_Python标准库random的方法randint(m,n)用来生成一个[m,n]区间上的随机整数。...
[判断题]已知列表 x = [1, 2, 3],那么执行语句 x = 3 之后,变量x的地址不变 [判断题]只能对列表进行切片操作,不能对元组和字符串进行切片操作 [单选题]Which is not ...
- python中wraps_python 装饰器及标准库functools中的wraps
最近在看 flask的视图装饰器 时,忽然想起预(复)习一下python的装饰器. 这里有一篇比较好的讲解装饰器的书写的 Python装饰器学习(九步入门) . 这里不单独记录装饰器的书写格式了,重点 ...
- python的input()函数与getpass标准库
1. input()函数给我们提供了从键盘输入数据的途径,我们经常用这个函数来读入用户名等一些可以明文显示的数据.但是对于像密码这样的要密文显示的场景,这个函数就显得不安全了.因此python也给我们 ...
- python守护进程进程池_Python3标准库:multiprocessing像线程一样管理进程
Python Python开发 Python语言 Python3标准库:multiprocessing像线程一样管理进程 1. multiprocessing像线程一样管理进程 multiproces ...
- Python学习笔记011_模块_标准库_第三方库的安装
容器 -> 数据的封装 函数 -> 语句的封装 类 -> 方法和属性的封装 模块 -> 模块就是程序 , 保存每个.py文件 # 创建了一个hello.py的文件,它的内容如下 ...
- python学习笔记(十)标准库pprint
引用的方式 不仅使标准库的模块,所有模块都服从下述引用方式. 最基本的.也是最常用的,还是可读性非常好的: import modulename 例如: >>> import ppri ...
最新文章
- 六层感知神经网络系统
- C++后台开发需要什么?
- CPP中的this指针
- c语言点阵字符,点阵的汉字程序
- 【LeetCode】剑指 Offer 14. 剪绳子
- 大数据该如何运行与分析
- 线性代数学习笔记8-1:复数矩阵与共轭转置、Hermite矩阵、酉矩阵、傅里叶矩阵和快速傅里叶变换FFT
- oracle11g监听配置访问QA
- 侧方位停车技巧图解 教你快速便捷停车(图)
- 在美国读博士的那七年
- GitHub + PicUloader + jsDelivr : 通过 web 上传的免费图床和图像访问 CDN 加速
- python atm作业详解_Python小案例--ATM系统
- 如何通过企业微信、飞书、钉钉消息通知接收双因子认证动态密码?
- 理解围绕软件技术标准的上层动机和力量
- 如何实现登录互踢 即如何实现当用户登录之后 如果在其他地方再次登录 则这边的用户自动退出系统...
- PHP7的session无法使用memcache
- 基于安卓的健康体检预约系统APP—计算机毕业设计
- H3C_S5500配置DHCP服务
- 【C#本质论 二】数据类型
- 嵌入式linux之go语言开发(九)关于嵌入式GUI
热门文章
- 快逸报表(润乾报表使用)(v4 版本)
- OpenCV身份证离线识别技术实战(一)
- python安装包错误的问题
- mnist数据集下载——mnist数据集提供百度网盘下载地址
- dump文件 linux,linux使用MAT分析dump文件
- win10同步服务器文件夹,和彩云如何设置同步文件夹?
- 小米球Ngrok-使用方法
- 2021华为软挑初探——代码实现
- linux grep -v多个关键字,Linux grep 命令详解
- 省市区三级联动 mysql_javaweb--json--ajax--mysql实现省市区三级联动(附三级联动数据库)...