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 opencv实现任意角度的透视变换实例代码
Jan 12 Python
Python cookbook(数据结构与算法)对切片命名清除索引的方法
Mar 13 Python
Python查找两个有序列表中位数的方法【基于归并算法】
Apr 20 Python
使用python将图片格式转换为ico格式的示例
Oct 22 Python
用pycharm开发django项目示例代码
Jun 13 Python
使用Python发现隐藏的wifi
Mar 04 Python
Python 合并拼接字符串的方法
Jul 28 Python
PyCharm2020.1.2社区版安装,配置及使用教程详解(Windows)
Aug 07 Python
使用Python爬取Json数据的示例代码
Dec 07 Python
解决Tkinter中button按钮未按却主动执行command函数的问题
May 23 Python
Pytorch中Softmax与LogSigmoid的对比分析
Jun 05 Python
Python PIL按比例裁剪图片
May 11 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+SqlServer实现分页显示
2006/10/09 PHP
JS中encodeURIComponent函数用php解码的代码
2012/03/01 PHP
浅析Yii中使用RBAC的完全指南(用户角色权限控制)
2013/06/20 PHP
CI框架Session.php源码分析
2014/11/03 PHP
php数组添加元素方法小结
2014/12/20 PHP
浅谈PHP中foreach/in_array的使用
2015/11/02 PHP
PHP实现表单提交时去除斜杠的方法
2016/12/26 PHP
我的Node.js学习之路(四)--单元测试
2014/07/06 Javascript
Bootstrap缩略图与警告框学习使用
2017/02/08 Javascript
AngularJS实现注册表单验证功能
2017/10/16 Javascript
jQuery实现的简单获取索引功能示例
2018/06/04 jQuery
微信小程序使用map组件实现获取定位城市天气或者指定城市天气数据功能
2019/01/22 Javascript
javascript创建元素和删除元素实例小结
2019/06/19 Javascript
layer更改皮肤的实现方法
2019/09/11 Javascript
vue+element tabs选项卡分页效果
2020/06/29 Javascript
create-react-app中添加less支持的实现
2019/11/15 Javascript
谈一谈vue请求数据放在created好还是mounted里好
2020/07/27 Javascript
[53:44]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma BO3 第一场 1月31日
2021/03/11 DOTA
Python实现将不规范的英文名字首字母大写
2016/11/15 Python
Python面向对象类编写细节分析【类,方法,继承,超类,接口等】
2019/01/05 Python
Python绘制并保存指定大小图像的方法
2019/01/10 Python
Python定义函数时参数有默认值问题解决
2019/12/19 Python
利用python生成照片墙的示例代码
2020/04/09 Python
keras 使用Lambda 快速新建层 添加多个参数操作
2020/06/10 Python
Java如何基于wsimport调用wcf接口
2020/06/17 Python
针对HTML5的Web Worker使用攻略
2015/07/12 HTML / CSS
戛纳奢侈品商店:Jacques Loup法国
2019/11/04 全球购物
甜品店的创业计划书范文
2014/01/02 职场文书
CAD制图设计师自荐信
2014/01/29 职场文书
公开服务承诺制度
2014/03/26 职场文书
售后客服工作职责
2014/06/16 职场文书
大学生心理活动总结
2014/07/04 职场文书
2015年七夕情人节活动方案
2015/05/06 职场文书
初中团委工作总结
2015/08/13 职场文书
2015年成本会计工作总结
2015/10/14 职场文书
简单聊聊TypeScript只读修饰符
2022/04/06 Javascript