Python itertools库详细教程
前言
库的学习地址:https://pymotw.com/2/itertools/
库的官网地址:https://docs.python.org/2/library/itertools.html
在Python中,迭代器(生成器, iterator)在Python中是一种很常用也很好用的数据结构,比起列表(list)来说,迭代器最大的优势就是延迟计算,按需使用,从而提高开发体验和运行效率,以至于在Python 3中map,filter等操作返回的不再是列表而是迭代器,所以,对于读取大文件或者无限集合,最好是使用迭代器。
Python的内置模块 itertools 就是用来操作迭代器的一个模块,包含的函数都是能够创建迭代器来用于 for循环或者 next(), itertools用于高效循环的迭代函数集合,其中很多函数的作用我们平时要写很多代码才能达到,而在运行效率上反而更低,毕竟人家是系统库。
其itertools库中的函数主要分为三类,分别为无限迭代器,有限迭代器,组合迭代器。
一.无限迭代器(Infinite Iterators)
这些函数可以生成无限的迭代器,概述如下:
下面详细学习:
1.count()
count([start=0, step=1]) 接收两个可选整形参数,第一个指定了迭代开始的值,第二个指定了迭代的步长。此外,start参数默认为0,step参数默认为1,可以根据需要来把这两个指定为其他值,或者使用默认参数。
import itertools
natuals = itertools.count(1)
for n in natuals:print(n)if n > 5:break#输出
1
2
3
4
5
6
因为count() 会创建一个无限的迭代器,所以上述代码会打印出自然数序列,根本停不下来,只能按Ctrl+C退出
2.cycle()
cycle(iterable) 是用一个可迭代对象中的元素来创建一个迭代器,并且复制自己的值,一直无限的重复下去。
import itertools
cs = itertools.cycle('ABC') # 注意字符串也是序列的一种
for c in cs:print(c) # 具有无限的输出,可以按ctrl+c来停止#输出
'A'
'B'
'C'
'A'
'B'
'C'
cycle() 同样停不下来,需要Ctrl+C停止。
3.repeat()
repeat(ele, [, n])
是将一个元素重复 n 遍或者无穷多变,并返回一个迭代器。不过如果提供第二个参数就可以限定重复次数。
ns = itertools.repeat('A', 5)
for n in ns:print(n)#输出
A
A
A
A
A
无限序列只有在 for 迭代时才会无限的迭代下去,如果只是创建了一个迭代对象,它不会实现把无限个元素生成出来,事实上也不可能在内存中创建无限多个元素。无限序列虽然可以无限迭代下去,但是我们通常会通过 takewhile() 等函数根据条件判断来截取一个有限的序列:
natuals = itertools.count(1)
ns = itertools.takewhile(lambda x: x <= 5, natuals)
for n in ns:print n#输出
1
2
3
4
5
二.有限迭代器(Iterators Terminating on the Shortest Input Sequence)
这里的函数有十来个,如下:
下面我们学习几个常用的:
1.chain()
chain(*iterables)
可以把多个可迭代对象组合起来,形成一个更大的迭代器。
比如:
for iter in itertools.chain('lebron', 'james'):print(iter)#输出
l
e
b
r
o
n
j
a
m
e
s
2 .groupby()
groupby(iterable, key=None) 可以把相邻元素按照 key 函数分组,并返回相应的 key 和 groupby,如果key函数为None,则只有相同的元素才能放在一组。
for key, group in itertools.groupby('AAABBBCCAAA'):print(key, list(group)) #输出
A ['A', 'A', 'A']
B ['B', 'B', 'B']
C ['C', 'C']
A ['A', 'A', 'A']
实际上挑选规则是通过函数完成的,只要作用于函数的两个元素返回的值相等,这两个元素就被认为是在一组的,而函数返回值作为组的key。如果我们要忽略大小写分组,就可以让元素“A”和‘a’都返回相等的key。
for key, group in itertools.groupby('AaaBBbcCAAa', lambda c: c.upper()):print(key, list(group))#输出
A ['A', 'a', 'a']
B ['B', 'B', 'b']
C ['c', 'C']
A ['A', 'A', 'a']
3.itertools.accumulate()
accumulate(iterable, [, func]) 可以计算出一个迭代器,这个迭代器是由特定的二元函数的累计结果生成的,如果不指定的话,默认函数为求和函数。
from itertools import accumulate<br>
x = accumulate(range(10))
print(list(x))
[0, 1, 3, 6, 10, 15, 21, 28, 36, 45]
如果我们指定这个累计函数,则还能有不同的用法,例如,指定一个最大值函数,或者自己定义的函数。
from itertools import accumulate# x1 = accumulate(range(10), max)
# print(list(x1))
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]x2 = accumulate(range(10), min)
print(list(x2))
# [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
三.组合迭代器(Combinatoric Iterators)
组合操作包括排列,笛卡尔积,或者一些离散元素的选择,组合迭代器就是产生这样序列的迭代器,概述如下:
下面我们来看看常用的几个函数:
1.product()
product(*iterables, repeat=1)
得到的是可迭代对象的笛卡尔积,*iterables参数表示需要多个可迭代对象。这些可迭代对象之间的笛卡尔积,也可以使用 for 循环来实现例如 product(A, B) 与 ((x, y) for x in A for y in B)就实现一样的功能。
import itertoolsfor i in itertools.product([1,2,3],[4,5,6]):print(i)#输出
(1, 4)
(1, 5)
(1, 6)
(2, 4)
(2, 5)
(2, 6)
(3, 4)
(3, 5)
(3, 6)
而 repeat() 参数则表示这些可迭代序列重复的次数。例如 product(A, repeat=4)与 product(A, A, A, A)实现的功能一样。
import itertools
for i in itertools.product('ab','cd',repeat = 2):print(i)#输出
('a', 'c', 'a', 'c')
('a', 'c', 'a', 'd')
('a', 'c', 'b', 'c')
('a', 'c', 'b', 'd')
('a', 'd', 'a', 'c')
('a', 'd', 'a', 'd')
('a', 'd', 'b', 'c')
('a', 'd', 'b', 'd')
('b', 'c', 'a', 'c')
('b', 'c', 'a', 'd')
('b', 'c', 'b', 'c')
('b', 'c', 'b', 'd')
('b', 'd', 'a', 'c')
('b', 'd', 'a', 'd')
('b', 'd', 'b', 'c')
('b', 'd', 'b', 'd')
2.permutations()
permutations(iterable, r=None)返回的是一个可迭代元素的一个排列组合,并且是按照顺序的,且不包含重复的结果。
#更多Python相关视频、资料加群778463939免费获取
from itertools import permutationsx = permutations((1,2,3))
print(list(x))
[(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]
当然,第二个参数默认为None,它表示的是返回元组(tuple)的长度,我们来尝试一下传入的第二个参数。
from itertools import permutationsx = permutations((1, 2, 3), 2)
print(list(x))
# [(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]
3.combinations()
combinations(iterable, r) 返回的是可迭代对象所有的长度为 r 的子序列,注意这个与前一个函数 permutations不同,permutations返回的是排列,而 combinations() 返回的是组合。
下面对比一下combinations() 与 permutations() 函数:
from itertools import permutations, combinationsx1 = permutations((1, 2, 3))
x2 = combinations((1, 2, 3), 3)
x11 = permutations((1, 2, 3), 2)
x22 = combinations((1, 2, 3), 2)
print(list(x1))
print(list(x2))
print(list(x11))
print(list(x22))
# [(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]
# [(1, 2, 3)]
# [(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]
# [(1, 2), (1, 3), (2, 3)]
4 combinations_with_replacement()
combinations_with_replacement(iterable, r)
返回一个可与自身重复的元素组合,用法类似于 combinations。
from itertools import combinations, combinations_with_replacementx1 = combinations((1, 2), 2)
x2 = combinations_with_replacement((1, 2), 2)
print(list(x1))
print(list(x2))
# [(1, 2)]
# [(1, 1), (1, 2), (2, 2)]
结尾给大家推荐一个非常好的学习教程,希望对你学习Python有帮助!
Python基础入门教程推荐:←点击左边蓝色文字就可以跳转观看了
Python爬虫案例教程推荐:←点击左边蓝色文字就可以跳转观看了
Python itertools库详细教程相关推荐
- python添加库详细教程_Python 中如何自动导入缺失的库?|python基础教程|python入门|python教程...
https://www.xin3721.com/eschool/pythonxin3721/ 在写 Python 项目的时候,我们可能经常会遇到导入模块失败的错误:ImportError: No mo ...
- Python数据分析【1】:matplotlib库详细教程
Python数据分析:matplotlib库详细教程 一.基本介绍 1. 数据分析 2. 环境安装 二.matplotlib 1. 基本介绍 2. 基本要点 3. 散点图/直方图/柱状图 4. 画图工 ...
- ubuntu下完全卸载 opencv库 详细教程
ubuntu下完全卸载 opencv库 详细教程 1:首先你需要先进入安装 opencv的build目录下(这个目录一般都会在你的 home里),进入build目录 执行卸载命令,这个命令执行起来比 ...
- 基于JUPYTER的python主流库新手教程(上)
基于JUPYTER的python主流库新手教程(上) 作者:二马传奇 0. 基本测试 for i in range(5):print(i,end=",") 0,1,2,3,4, 1 ...
- Linux下利用python实现语音识别详细教程
Linux下python实现语音识别详细教程 语音识别工作原理简介 选择合适的python语音识别包 安装SpeechRecognition 识别器类 音频文件的使用 英文的语音识别 噪音对语音识别的 ...
- Linux离线安装python第三方库详细步骤
Linux离线安装python第三方库详细步骤 01 查看服务器上的OS版本 02 查看已安装的python版本 03 查看python3支持的whl 04 国内镜像源网站下载whl 05 最后执行 ...
- Python 自动发送邮件详细教程
自动发送邮件能应用于许多场景中,比如我想要知道股票策略中的股票池是否有实时的更新,这时候如果再拉一遍数据,跑一遍脚本,实在是太浪费时间了.为什么不把这一套流程放到服务器上,然后到点自动运行并发送邮件呢 ...
- [转载] python标准库系列教程(三)——operator库详细教程
参考链接: Python中的Inplace运算符| 2(ixor(),iand(),ipow()等) python进阶教程 机器学习 深度学习 长按二维码关注 进入正文 Python基础学习:oper ...
- Python之Numpy详细教程
NumPy - 简介 NumPy 是一个 Python 包. 它代表 "Numeric Python". 它是一个由多维数组对象和用于处理数组的例程集合组成的库. Numeric, ...
最新文章
- OpenSuse Linux 的单用户模式
- html自适应pc窗口大小_自适应技术很难吗?为什么Shopyy平台将网站分为PC端和移动端...
- python真的这么厉害吗-Python为什么这么厉害?——Python ,能用来做什么
- 伦敦大学 机器人科学(研究型硕士) 项目介绍!干货满满!
- 深入理解Activity启动流程(二)–Activity启动相关类的类图
- 百度地图上的标注物太多导致界面卡顿的解决办法
- 三星固态驱动安装失败_三星950 Pro固态硬盘用U盘装win7失败解决教程
- openSUSE 11.2 上试动Mono
- 【小旭学长-使用python进行城市数据分析】笔记篇(中)
- 计算机网络有什么部分组成,计算机网络有哪些组成部分和详细对比
- [虚幻引擎] UE4/5数字孪生 制作城市光束效果
- sinc插值原理及其实现
- 气传导耳机是什么原理?气传导蓝牙耳机优缺点分析
- CPU中运算器的功能
- linux添加五笔输入法,在Ubuntu16.04中为fctix小企鹅增加五笔输入法
- 【JAVA枚举类型】
- CentOS7.2 Django + uwsgi + Nginx 部(cǎi )署(kēng)指(zhī)南(lǜ)
- C#基础------常用软件官方下载
- 日本准备推行AI婚配,年轻人会为“爱情算法”买单吗?
- ubuntu18.04上的draftsight 2D的安装
热门文章
- 净化网络环境!可信数字内容版权服务解决方案发布
- MariaDB Window Functions窗口函数分组取TOP N记录
- Linux查看swap使用情况小脚本
- ASP.NET应用程序使用NLog记录日志
- 2007微软技术大会(TechEd)开幕式
- js正则贪婪模式_JavaScript正则表达式迷你书之贪婪模式-学习笔记
- Eclipse与MyEclipse的选择问题
- 修改ALSM_EXCEL_TO_INTERNAL_TABLE的限制
- SAP中采购订单状态与MRP的关系
- alv+checkbox+select all