相见恨晚的 Python 内置库:itertools

俊红的数据分析之路

共 3938字,需浏览 8分钟

 ·

2022-02-26 07:30


来源 : 忆先

01 前言

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

02 itertools库

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

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

03 使用itertools

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

itertools.accumulate

简单来说就是累加。

>>> import itertools
>>> x = itertools.accumulate(range(10))
>>> print(list(x))
[0136101521283645]
itertools.chain

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

>>> x = itertools.chain(range(3), range(4), [3,2,1])
>>> print(list(x))
[0120123321]
itertools.combinations
求列表或生成器中指定数目的元素不重复的所有组合
>>> x = itertools.combinations(range(4), 3)
>>> print(list(x))
[(012), (013), (023), (123)]
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), (TrueFalseTrueTrueFalse))
>>> print(list(x))
[023]
itertools.count
就是一个计数器,可以指定起始位置和步长
>>> x = itertools.count(start=20, step=-1)
>>> print(list(itertools.islice(x, 0101)))
[20191817161514131211]
itertools.cycle
循环指定的列表和迭代器
>>> x = itertools.cycle('ABC')
>>> print(list(itertools.islice(x, 0101)))
['A''B''C''A''B''C''A''B''C''A']
itertools.dropwhile
按照真值函数丢弃掉列表和迭代器前面的元素
>>> x = itertools.dropwhile(lambda e: e < 5, range(10))
>>> print(list(x))
[56789]
itertools.filterfalse
保留对应真值为False的元素
>>> x = itertools.filterfalse(lambda e: e < 5, (153694))
>>> print(list(x))
[569]
itertools.groupby
按照分组函数的值对元素进行分组
>>> x = itertools.groupby(range(10), lambda x: x < 5 or x > 8)                                                                                                
>>> for condition, numbers in x:                                                  
...     print(condition, list(numbers))                                                                                                        
True [01234]                                                              
False [5678]                                                                
True [9]
itertools.islice
上文使用过的函数,对迭代器进行切片
>>> x = itertools.islice(range(10), 092)
>>> print(list(x))
[02468]
itertools.permutations
产生指定数目的元素的所有排列(顺序有关)
>>> x = itertools.permutations(range(4), 3)
>>> print(list(x))
[(012), (013), (021), (023), (031), (032), (102), (103), (120), (123), (130), (132), (201), (20,3), (210), (213), (230), (231), (301), (302), (310), (312), (320), (321)]
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(05)
>>> print(list(x))
[00000]
itertools.starmap
类似map
>>> x = itertools.starmap(str.islower, 'aBCDefGhI')
>>> print(list(x))
[TrueFalseFalseFalseTrueTrueFalseTrueFalse]
itertools.takewhile
与dropwhile相反,保留元素直至真值函数值为假。
>>> x = itertools.takewhile(lambda e: e < 5, range(10))
>>> print(list(x))
[01234]
itertools.tee
这个函数我也不是很懂,似乎是生成指定数目的迭代器
>>> x = itertools.tee(range(10), 2)
>>> for letters in x:
...     print(list(letters))
...
[0123456789]
[0123456789]
itertools.zip_longest
类似于zip,不过已较长的列表和迭代器的长度为准
>>> x = itertools.zip_longest(range(3), range(5))
>>> y = zip(range(3), range(5))
>>> print(list(x))
[(00), (11), (22), (None3), (None4)]
>>> print(list(y))
[(00), (11), (22)]

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


对比Excel系列图书累积销量达15w册,让你轻松掌握数据分析技能,可以在全网搜索书名进行了解:
浏览 26
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报