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时间戳与时间字符串互相转换实例代码
Nov 28 Python
跟老齐学Python之做一个小游戏
Sep 28 Python
python修改字典内key对应值的方法
Jul 11 Python
Python Socket使用实例
Dec 18 Python
python方向键控制上下左右代码
Jan 20 Python
浅谈Pycharm中的Python Console与Terminal
Jan 17 Python
Python中类似于jquery的pyquery库用法分析
Dec 02 Python
python 实现视频 图像帧提取
Dec 10 Python
PyCharm+Pipenv虚拟环境开发和依赖管理的教程详解
Apr 16 Python
python speech模块的使用方法
Sep 09 Python
Jupyter Notebook 远程访问配置详解
Jan 11 Python
利用Pycharm连接服务器的全过程记录
Jul 01 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验证码代码
2012/02/27 PHP
PHP static局部静态变量和全局静态变量总结
2014/03/02 PHP
2017年最好用的9个php开发工具推荐(超好用)
2017/10/23 PHP
jQuery 表格工具集
2010/04/25 Javascript
基于jquery的bankInput银行卡账号格式化
2012/08/22 Javascript
JavaScript自执行闭包的小例子
2013/06/29 Javascript
Javascript页面添加到收藏夹的简单方法
2013/08/07 Javascript
JavaScript对内存分配及管理机制详细解析
2013/11/11 Javascript
js获取url中&quot;?&quot;后面的字串方法
2014/05/15 Javascript
基于jQuery插件实现环形图标菜单旋转切换特效
2015/05/15 Javascript
分享五个有用的jquery小技巧
2015/10/08 Javascript
使用Javascript写的2048小游戏
2015/11/25 Javascript
浅谈js的url解析函数封装
2016/06/28 Javascript
bootstrap提示标签、提示框实现代码
2016/12/28 Javascript
JS+HTML5 Canvas实现简单的写字板功能示例
2018/08/30 Javascript
Vue 用Vant实现时间选择器的示例代码
2019/10/25 Javascript
一起写一个即插即用的Vue Loading插件实现
2019/10/31 Javascript
JS中间件设计模式的深入探讨与实例分析
2020/04/11 Javascript
python函数形参用法实例分析
2015/08/04 Python
Python文件操作基本流程代码实例
2017/12/11 Python
Python使用pickle模块存储数据报错解决示例代码
2018/01/26 Python
python版本五子棋的实现代码
2018/12/11 Python
python中比较两个列表的实例方法
2019/07/04 Python
python之array赋值技巧分享
2019/11/28 Python
浅谈python的elementtree模块处理中文注意事项
2020/03/06 Python
浅谈Html5多线程开发之WebWorkers
2018/05/02 HTML / CSS
英国时尚优质的女装:Hope Fashion
2018/08/14 全球购物
西雅图电动自行车公司:Rad Power Bikes
2020/02/02 全球购物
"引用"与指针的区别是什么
2016/09/07 面试题
大二学期个人自我评价
2014/01/13 职场文书
鼓励运动员的广播稿
2014/02/08 职场文书
竞选学委演讲稿
2014/09/13 职场文书
教师个人年终总结
2015/02/11 职场文书
供应商食品安全承诺书
2015/04/29 职场文书
死磕 java同步系列之synchronized解析
2021/06/28 Java/Android
简单且有用的Python数据分析和机器学习代码
2021/07/02 Python