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)

这些函数可以生成无限的迭代器,概述如下:

Python itertools库详细教程_第1张图片
下面详细学习:

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)

这里的函数有十来个,如下:
Python itertools库详细教程_第2张图片
下面我们学习几个常用的:

1.chain()

chain(*iterables)可以把多个可迭代对象组合起来,形成一个更大的迭代器。

比如:

for iter in itertools.chain('lebron', 'james'):
    print(iter)
  
#输出
l
e
b
r
o
n
j
a
m
e
s
2 .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)

组合操作包括排列,笛卡尔积,或者一些离散元素的选择,组合迭代器就是产生这样序列的迭代器,概述如下:
Python itertools库详细教程_第3张图片
下面我们来看看常用的几个函数:

1.product()

product(*iterables, repeat=1)得到的是可迭代对象的笛卡尔积,*iterables参数表示需要多个可迭代对象。这些可迭代对象之间的笛卡尔积,也可以使用 for 循环来实现例如 product(A, B) 与 ((x, y) for x in A for y in B)就实现一样的功能。

import itertools
 
for 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 permutations
 
x = 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 permutations
 
x = 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, combinations
 
x1 = 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_replacement
 
x1 = 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常用模块,python,开发语言,后端)