Python itertools库详细教程
前言
-
库的学习地址:https://pymotw.com/2/itertools/
-
库的官网地址:https://docs.python.org/2/library/itertools.html
在Python中,迭代器(生成器, iterator)在Python中是一种很常用也很好用的数据结构,比起列表(list)来说,迭代器最大的优势就是延迟计算,按需使用,从而提高开发体验和运行效率,以至于在Python 3中map,filter等操作返回的不再是列表而是迭代器,所以,对于读取大文件或者无限集合,最好是使用迭代器。
Python的内置模块 itertools 就是用来操作迭代器的一个模块,包含的函数都是能够创建迭代器来用于 for循环或者 next(), itertools用于高效循环的迭代函数集合,其中很多函数的作用我们平时要写很多代码才能达到,而在运行效率上反而更低,毕竟人家是系统库。
其itertools库中的函数主要分为三类,分别为无限迭代器,有限迭代器,组合迭代器。
一.无限迭代器(Infinite Iterators)
这些函数可以生成无限的迭代器,概述如下:
下面详细学习:
1.count()
count([start=0, step=1]) 接收两个可选整形参数,第一个指定了迭代开始的值,第二个指定了迭代的步长。此外,start参数默认为0,step参数默认为1,可以根据需要来把这两个指定为其他值,或者使用默认参数。
import itertools natuals = itertools.count(1) for n in natuals:print(n)if n > 5:break#输出 1 2 3 4 5 6因为count() 会创建一个无限的迭代器,所以上述代码会打印出自然数序列,根本停不下来,只能按Ctrl+C退出
2.cycle()
cycle(iterable) 是用一个可迭代对象中的元素来创建一个迭代器,并且复制自己的值,一直无限的重复下去。
import itertools cs = itertools.cycle('ABC') # 注意字符串也是序列的一种 for c in cs:print(c) # 具有无限的输出,可以按ctrl+c来停止#输出 'A' 'B' 'C' 'A' 'B' 'C'cycle() 同样停不下来,需要Ctrl+C停止。
3.repeat()
repeat(ele, [, n])是将一个元素重复 n 遍或者无穷多变,并返回一个迭代器。不过如果提供第二个参数就可以限定重复次数。
ns = itertools.repeat('A', 5) for n in ns:print(n)#输出 A A A A A无限序列只有在 for 迭代时才会无限的迭代下去,如果只是创建了一个迭代对象,它不会实现把无限个元素生成出来,事实上也不可能在内存中创建无限多个元素。无限序列虽然可以无限迭代下去,但是我们通常会通过 takewhile() 等函数根据条件判断来截取一个有限的序列:
natuals = itertools.count(1) ns = itertools.takewhile(lambda x: x <= 5, natuals) for n in ns:print n#输出 1 2 3 4 5二.有限迭代器(Iterators Terminating on the Shortest Input Sequence)
这里的函数有十来个,如下:
下面我们学习几个常用的:
1.chain()
chain(*iterables)可以把多个可迭代对象组合起来,形成一个更大的迭代器。
比如:
for iter in itertools.chain('lebron', 'james'):print(iter)#输出 l e b r o n j a m e s2 .groupby()
groupby(iterable, key=None) 可以把相邻元素按照 key 函数分组,并返回相应的 key 和 groupby,如果key函数为None,则只有相同的元素才能放在一组。
for key, group in itertools.groupby('AAABBBCCAAA'):print(key, list(group)) #输出 A ['A', 'A', 'A'] B ['B', 'B', 'B'] C ['C', 'C'] A ['A', 'A', 'A']实际上挑选规则是通过函数完成的,只要作用于函数的两个元素返回的值相等,这两个元素就被认为是在一组的,而函数返回值作为组的key。如果我们要忽略大小写分组,就可以让元素“A”和‘a’都返回相等的key。
for key, group in itertools.groupby('AaaBBbcCAAa', lambda c: c.upper()):print(key, list(group))#输出 A ['A', 'a', 'a'] B ['B', 'B', 'b'] C ['c', 'C'] A ['A', 'A', 'a']3.itertools.accumulate()
accumulate(iterable, [, func]) 可以计算出一个迭代器,这个迭代器是由特定的二元函数的累计结果生成的,如果不指定的话,默认函数为求和函数。
from itertools import accumulate<br> x = accumulate(range(10)) print(list(x)) [0, 1, 3, 6, 10, 15, 21, 28, 36, 45]如果我们指定这个累计函数,则还能有不同的用法,例如,指定一个最大值函数,或者自己定义的函数。
from itertools import accumulate# x1 = accumulate(range(10), max) # print(list(x1)) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]x2 = accumulate(range(10), min) print(list(x2)) # [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]三.组合迭代器(Combinatoric Iterators)
组合操作包括排列,笛卡尔积,或者一些离散元素的选择,组合迭代器就是产生这样序列的迭代器,概述如下:
下面我们来看看常用的几个函数:
1.product()
product(*iterables, repeat=1)得到的是可迭代对象的笛卡尔积,*iterables参数表示需要多个可迭代对象。这些可迭代对象之间的笛卡尔积,也可以使用 for 循环来实现例如 product(A, B) 与 ((x, y) for x in A for y in B)就实现一样的功能。
import itertoolsfor i in itertools.product([1,2,3],[4,5,6]):print(i)#输出 (1, 4) (1, 5) (1, 6) (2, 4) (2, 5) (2, 6) (3, 4) (3, 5) (3, 6)而 repeat() 参数则表示这些可迭代序列重复的次数。例如 product(A, repeat=4)与 product(A, A, A, A)实现的功能一样。
import itertools for i in itertools.product('ab','cd',repeat = 2):print(i)#输出 ('a', 'c', 'a', 'c') ('a', 'c', 'a', 'd') ('a', 'c', 'b', 'c') ('a', 'c', 'b', 'd') ('a', 'd', 'a', 'c') ('a', 'd', 'a', 'd') ('a', 'd', 'b', 'c') ('a', 'd', 'b', 'd') ('b', 'c', 'a', 'c') ('b', 'c', 'a', 'd') ('b', 'c', 'b', 'c') ('b', 'c', 'b', 'd') ('b', 'd', 'a', 'c') ('b', 'd', 'a', 'd') ('b', 'd', 'b', 'c') ('b', 'd', 'b', 'd')2.permutations()
permutations(iterable, r=None)返回的是一个可迭代元素的一个排列组合,并且是按照顺序的,且不包含重复的结果。
#更多Python相关视频、资料加群778463939免费获取 from itertools import permutationsx = permutations((1,2,3)) print(list(x)) [(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)]当然,第二个参数默认为None,它表示的是返回元组(tuple)的长度,我们来尝试一下传入的第二个参数。
from itertools import permutationsx = permutations((1, 2, 3), 2) print(list(x)) # [(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]3.combinations()
combinations(iterable, r) 返回的是可迭代对象所有的长度为 r 的子序列,注意这个与前一个函数 permutations不同,permutations返回的是排列,而 combinations() 返回的是组合。
下面对比一下combinations() 与 permutations() 函数:
from itertools import permutations, combinationsx1 = permutations((1, 2, 3)) x2 = combinations((1, 2, 3), 3) x11 = permutations((1, 2, 3), 2) x22 = combinations((1, 2, 3), 2) print(list(x1)) print(list(x2)) print(list(x11)) print(list(x22)) # [(1, 2, 3), (1, 3, 2), (2, 1, 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)] # [(1, 2, 3)] # [(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)] # [(1, 2), (1, 3), (2, 3)]4 combinations_with_replacement()
combinations_with_replacement(iterable, r)返回一个可与自身重复的元素组合,用法类似于 combinations。
from itertools import combinations, combinations_with_replacementx1 = combinations((1, 2), 2) x2 = combinations_with_replacement((1, 2), 2) print(list(x1)) print(list(x2)) # [(1, 2)] # [(1, 1), (1, 2), (2, 2)]结尾给大家推荐一个非常好的学习教程,希望对你学习Python有帮助!
Python基础入门教程推荐:←点击左边蓝色文字就可以跳转观看了
Python爬虫案例教程推荐:←点击左边蓝色文字就可以跳转观看了
总结
以上是生活随笔为你收集整理的Python itertools库详细教程的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: python教程:使用生成器重构提取数据
- 下一篇: Python三元运算