Python标准库之itertools库的使用方法


Posted in Python onSeptember 07, 2017

前言

因为最近事情不是很多,想写一些技术文章分享给大家,同时也对自己一段时间来碎片化接受的知识进行一下梳理,所谓写清楚才能说清楚,说清楚才能想清楚,就是这个道理了。

很多人都致力于把Python代码写得更Pythonic,一来更符合规范且容易阅读,二来一般Pythonic的代码在执行上也更有效率。今天就先给大家介绍一下Python的系统库itertools。下面话不多说了,来一起看看详细的介绍吧。

itertools库

迭代器(生成器)在Python中是一种很常用也很好用的数据结构,比起列表(list)来说,迭代器最大的优势就是延迟计算,按需使用,从而提高开发体验和运行效率,以至于在Python 3中map,filter等操作返回的不再是列表而是迭代器。

话虽这么说但大家平时用到的迭代器大概只有range了,而通过iter函数把列表对象转化为迭代器对象又有点多此一举,这时候我们今天的主角itertools就该上场了。

使用itertools

itertools中的函数大多是返回各种迭代器对象,其中很多函数的作用我们平时要写很多代码才能达到,而在运行效率上反而更低,毕竟人家是系统库。

itertools.accumulate

简单来说就是累加。

>>> import itertools
>>> x = itertools.accumulate(range(10))
>>> print(list(x))
[0, 1, 3, 6, 10, 15, 21, 28, 36, 45]

itertools.chain

连接多个列表或者迭代器。

>>> x = itertools.chain(range(3), range(4), [3,2,1])
>>> print(list(x))
[0, 1, 2, 0, 1, 2, 3, 3, 2, 1]

itertools.combinations

求列表或生成器中指定数目的元素不重复的所有组合

>>> x = itertools.combinations(range(4), 3)
>>> print(list(x))
[(0, 1, 2), (0, 1, 3), (0, 2, 3), (1, 2, 3)]

itertools.combinations_with_replacement

允许重复元素的组合

>>> x = itertools.combinations_with_replacement('ABC', 2)
>>> print(list(x))
[('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'B'), ('B', 'C'), ('C', 'C')]

itertools.compress

按照真值表筛选元素

>>> x = itertools.compress(range(5), (True, False, True, True, False))
>>> print(list(x))
[0, 2, 3]

itertools.count

就是一个计数器,可以指定起始位置和步长

>>> x = itertools.count(start=20, step=-1)
>>> print(list(itertools.islice(x, 0, 10, 1)))
[20, 19, 18, 17, 16, 15, 14, 13, 12, 11]

itertools.cycle

循环指定的列表和迭代器

>>> x = itertools.cycle('ABC')
>>> print(list(itertools.islice(x, 0, 10, 1)))
['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C', 'A']

itertools.dropwhile

按照真值函数丢弃掉列表和迭代器前面的元素

>>> x = itertools.dropwhile(lambda e: e < 5, range(10))
>>> print(list(x))
[5, 6, 7, 8, 9]

itertools.filterfalse

保留对应真值为False的元素

>>> x = itertools.filterfalse(lambda e: e < 5, (1, 5, 3, 6, 9, 4))
>>> print(list(x))
[5, 6, 9]

itertools.groupby

按照分组函数的值对元素进行分组

>>> x = itertools.groupby(range(10), lambda x: x < 5 or x > 8)             
>>> for condition, numbers in x:       
... print(condition, list(numbers))             
True [0, 1, 2, 3, 4]        
False [5, 6, 7, 8]        
True [9]

itertools.islice

上文使用过的函数,对迭代器进行切片

>>> x = itertools.islice(range(10), 0, 9, 2)
>>> print(list(x))
[0, 2, 4, 6, 8]

itertools.permutations

产生指定数目的元素的所有排列(顺序有关)

>>> x = itertools.permutations(range(4), 3)
>>> print(list(x))
[(0, 1, 2), (0, 1, 3), (0, 2, 1), (0, 2, 3), (0, 3, 1), (0, 3, 2), (1, 0, 2), (1, 0, 3), (1, 2, 0), (1, 2, 3), (1, 3, 0), (1, 3, 2), (2, 0, 1), (2, 0, 3), (2, 1, 0), (2, 1, 3), (2, 3, 0), (2, 3, 1), (3, 0, 1), (3, 0, 2), (3, 1, 0), (3, 1, 2), (3, 2, 0), (3, 2, 1)]

itertools.product

产生多个列表和迭代器的(积)

>>> x = itertools.product('ABC', range(3))
>>>
>>> print(list(x))
[('A', 0), ('A', 1), ('A', 2), ('B', 0), ('B', 1), ('B', 2), ('C', 0), ('C', 1), ('C', 2)]

itertools.repeat

简单的生成一个拥有指定数目元素的迭代器

>>> x = itertools.repeat(0, 5)
>>> print(list(x))
[0, 0, 0, 0, 0]

itertools.starmap

类似map

>>> x = itertools.starmap(str.islower, 'aBCDefGhI')
>>> print(list(x))
[True, False, False, False, True, True, False, True, False]

itertools.takewhile

与dropwhile相反,保留元素直至真值函数值为假。

>>> x = itertools.takewhile(lambda e: e < 5, range(10))
>>> print(list(x))
[0, 1, 2, 3, 4]

itertools.tee

这个函数我也不是很懂,似乎是生成指定数目的迭代器

>>> x = itertools.tee(range(10), 2)
>>> for letters in x:
... print(list(letters))
...
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

itertools.zip_longest

类似于zip,不过已较长的列表和迭代器的长度为准

>>> x = itertools.zip_longest(range(3), range(5))
>>> y = zip(range(3), range(5))
>>> print(list(x))
[(0, 0), (1, 1), (2, 2), (None, 3), (None, 4)]
>>> print(list(y))
[(0, 0), (1, 1), (2, 2)]

结语

大概就总结到这里,不过老实说Python的各种语言特性和库还是要多用才能熟练,最终达到随手拈来的程度,装逼的说就是由术入道。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
Python六大开源框架对比
Oct 19 Python
Python中二维列表如何获取子区域元素的组成
Jan 19 Python
详解Numpy中的广播原则/机制
Sep 20 Python
解决pycharm无法识别本地site-packages的问题
Oct 13 Python
浅谈Python采集网页时正则表达式匹配换行符的问题
Dec 20 Python
解决tensorflow添加ptb库的问题
Feb 10 Python
Python多个装饰器的调用顺序实例解析
May 22 Python
Pytorch使用PIL和Numpy将单张图片转为Pytorch张量方式
May 25 Python
Python编写单元测试代码实例
Sep 10 Python
Python logging自定义字段输出及打印颜色
Nov 30 Python
python基于win32api实现键盘输入
Dec 09 Python
pytorch实现加载保存查看checkpoint文件
Jul 15 Python
在Python的一段程序中如何使用多次事件循环详解
Sep 07 #Python
教你学会使用Python正则表达式
Sep 07 #Python
Python基础学习之常见的内建函数整理
Sep 06 #Python
Python升级导致yum、pip报错的解决方法
Sep 06 #Python
Python实现求两个csv文件交集的方法
Sep 06 #Python
Python中的is和==比较两个对象的两种方法
Sep 06 #Python
Python中表示字符串的三种方法
Sep 06 #Python
You might like
PHP中的正规表达式(一)
2006/10/09 PHP
php获取网卡的MAC地址支持WIN/LINUX系统
2014/04/30 PHP
对PHP新手的一些建议(PHP学习经验总结)
2014/08/20 PHP
浅谈php正则表达式中的非贪婪模式匹配的使用
2014/11/25 PHP
PHP laravel中的多对多关系实例详解
2017/06/07 PHP
php 算法之实现相对路径的实例
2017/10/17 PHP
网页中的图片的处理方法与代码
2009/11/26 Javascript
用javascript获取当页面上鼠标光标位置和触发事件的对象的代码
2009/12/09 Javascript
JavaScript实用技巧(一)
2010/08/16 Javascript
myeclipse安装jQuery插件的方法
2011/03/29 Javascript
javaScript事件机制兼容【详细整理】
2016/07/23 Javascript
Bootstrap文件上传组件之bootstrap fileinput
2016/11/25 Javascript
微信小程序 自定义对话框实例详解
2017/01/20 Javascript
nodejs基于express实现文件上传的方法
2018/03/19 NodeJs
vue内置指令详解
2018/04/03 Javascript
vue 组件使用中的一些细节点
2018/04/25 Javascript
基于JS实现一个随机生成验证码功能
2019/05/29 Javascript
基于ssm框架实现layui分页效果
2019/07/27 Javascript
vue 实现购物车总价计算
2019/11/06 Javascript
Python2.7基于笛卡尔积算法实现N个数组的排列组合运算示例
2017/11/23 Python
python实现猜数字小游戏
2020/03/24 Python
python3人脸识别的两种方法
2019/04/25 Python
win10子系统python开发环境准备及kenlm和nltk的使用教程
2019/10/14 Python
Pytorch Tensor 输出为txt和mat格式方式
2020/01/03 Python
python函数map()和partial()的知识点总结
2020/05/26 Python
通过Django Admin+HttpRunner1.5.6实现简易接口测试平台
2020/11/11 Python
自我鉴定200字
2013/10/28 职场文书
大学总结自我鉴定
2014/01/18 职场文书
护理专业大学生自我推荐信
2014/01/25 职场文书
大学生就业自我推荐信
2014/05/10 职场文书
2015年全国助残日活动方案
2015/05/04 职场文书
2015年乡镇科普工作总结
2015/05/13 职场文书
2016关于读书活动的心得体会
2016/01/14 职场文书
2019大学生社会实践报告汇总
2019/08/16 职场文书
python自动统计zabbix系统监控覆盖率的示例代码
2021/04/03 Python
如何利用js在两个html窗口间通信
2021/04/27 Javascript