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 相关文章推荐
python3使用scrapy生成csv文件代码示例
Dec 28 Python
Python装饰器用法实例总结
Feb 07 Python
python数据封装json格式数据
Mar 04 Python
浅谈pandas中Dataframe的查询方法([], loc, iloc, at, iat, ix)
Apr 10 Python
基于python requests库中的代理实例讲解
May 07 Python
python爬虫自动创建文件夹的功能
Aug 01 Python
对python修改xml文件的节点值方法详解
Dec 24 Python
用Python徒手撸一个股票回测框架搭建【推荐】
Aug 05 Python
django框架用户权限中的session缓存到redis中的方法
Aug 06 Python
Python学习之os模块及用法
Jun 03 Python
结束运行python的方法
Jun 16 Python
Django使用channels + websocket打造在线聊天室
May 20 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
综合图片计数器
2006/10/09 PHP
晋城吧对DiscuzX进行的前端优化要点
2010/09/05 PHP
JS与PHP向函数传递可变参数的区别实例代码
2011/05/18 PHP
php 批量生成html,txt文件的实现代码
2013/06/26 PHP
JQuery 确定css方框模型(盒模型Box Model)
2010/01/22 Javascript
javascript淡入淡出效果的实现思路
2012/03/31 Javascript
$.getJSON在IE下失效的原因分析及解决方法
2013/06/16 Javascript
div浮层,滚动条移动,位置保持不变的4种方法汇总
2013/12/11 Javascript
javascript将浮点数转换成整数的三个方法
2014/06/23 Javascript
Node.js安装教程和NPM包管理器使用详解
2014/08/16 Javascript
JavaScript中number转换成string介绍
2014/12/31 Javascript
浅析nodejs实现Websocket的数据接收与发送
2015/11/19 NodeJs
日常收集整理的JavaScript常用函数方法
2015/12/10 Javascript
VUE长按事件需求详解
2017/10/18 Javascript
使用Bootrap和Vue实现仿百度搜索功能
2017/10/26 Javascript
jQuery+CSS实现的table表格行列转置功能示例
2018/01/08 jQuery
NodeJS加密解密及node-rsa加密解密用法详解
2018/10/12 NodeJs
微信小程序利用swiper+css实现购物车商品删除功能
2019/03/06 Javascript
微信小程序封装多张图片上传api代码实例
2019/12/30 Javascript
[01:14:35]DOTA2上海特级锦标赛B组资格赛#1 Alliance VS Fnatic第一局
2016/02/26 DOTA
python笔记(2)
2012/10/24 Python
python模拟登录并且保持cookie的方法详解
2017/04/04 Python
Python面向对象编程基础解析(一)
2017/10/26 Python
浅谈用VSCode写python的正确姿势
2017/12/16 Python
利用Python实现Shp格式向GeoJSON的转换方法
2019/07/09 Python
Python 实现3种回归模型(Linear Regression,Lasso,Ridge)的示例
2020/10/15 Python
分享一个python的aes加密代码
2020/12/22 Python
法国在线药房:Shop Pharmacie
2019/11/26 全球购物
营业员个人总结的自我评价
2013/10/25 职场文书
村捐赠仪式答谢词
2014/01/21 职场文书
亮剑精神演讲稿
2014/05/23 职场文书
法人任命书范本
2014/06/04 职场文书
球队口号
2014/06/18 职场文书
考试作弊被抓检讨书
2014/10/02 职场文书
2014年仓库工作总结
2014/11/20 职场文书
动画「半妖的夜叉姬」新BD特典图公开
2022/03/22 日漫