itertools模块
itertools 是python的迭代器模块,itertools提供的工具相当高效且节省内存。Python的内建模块itertools提供了非常有用的用于操作迭代对象的函数。使用这些工具,你将能够创建自己定制的迭代器用于高效率的循环。
1.无限迭代器
(1)count(初值=0, 步长=1):
count 迭代器会返回从传入的起始参数开始的均匀间隔的数值。count 也可以接收指定的步长参数。
"""count(初值,步长)"""
from itertools import count
for i in count(10, 2): # 从10开始,每步长隔2,无限循环(此案例演示大于100退出)
if i > 100:
break
else:
print(i) # 打印结果:10,12,14,16,18,...,98,100
(2)islice(iterable,start,stop,步长):
从 10 开始,输出 5 个元素后结束。islice 的第二个参数控制何时停止迭代。但其含义并不是”达到数字 5 时停止“,而是”当迭代了 5 次之后停止“。
"""isslice(迭代器,迭代次数)"""
from itertools import islice
for i in islice(count(10), 5):
print(i) # 打印结果:10,11,12,13,14
for j in islice([1, 2, 3, 4, 5], 2):
print(j) # 打印结果:1,2
(3)cycle:
这里我们创建了一个 for 循环,使其在三个字母 XYZ 间无限循环。当然,我们并不真地想要永远循环下去,所以我们添加了一个简单的计数器来跳出循环。
from itertools import cycle
count = 0
for item in cycle('XYZ'):
if count > 7:
break
print(item) # X,Y,Z,X,Y,Z,X,Y
count += 1
(4)repeat():
负责把一个元素无限重复下去,不过如果提供第二个参数就可以限定重复次数:
from itertools import repeat
for i in repeat('1', 5):
print(i) # 1,1,1,1,1
2.可终止迭代器
(1)accumulate(可迭代对象[, 函数])
accumulate 迭代器将返回累计求和结果,或者传入两个参数的话,由传入的函数累积计算的结果。默认设定为相加
from itertools import accumulate
for i in accumulate(range(7)):
print(i) # 0,1,3,6,10,15,21
for i in accumulate([1, 2, 3, 4, 5], lambda x, y: x * y):
print(i) # 1,2,6,24,120
(2)chain(*可迭代对象)
chain 迭代器能够将多个可迭代对象合并成一个更长的可迭代对象。
from itertools import chain
x = chain(range(3), range(3, 5), [5, 6, 7], (8, 9), '11')
print(list(x)) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, '1', '1']
(3)groupby()
groupby()把迭代器中相邻的重复元素挑出来放在一起:
from itertools import groupby
for key, group in groupby('AAABBBCCAAA'):
print(key, list(group))
# 结果:
"""
A ['A', 'A', 'A']
B ['B', 'B', 'B']
C ['C', 'C']
A ['A', 'A', 'A']
"""
也可以使用函数,按照分组函数的值对元素进行分组
from itertools import groupby
x = 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]
"""
(4)itertools.combinations(可迭代对象,组合个数)
求列表或生成器中指定数目的元素不重复的所有组合。
(5)itertools.combinations_with_replacement(可迭代对象,组合个数)
允许重复元素的组合
from itertools import combinations, combinations_with_replacement
x = combinations(['A', 'B', 'C'], 2)
y = combinations_with_replacement(['A', 'B', 'C'], 2)
print(list(x)) # [('A', 'B'), ('A', 'C'), ('B', 'C')]
print(list(y)) # [('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'B'), ('B', 'C'), ('C', 'C')]
(5)itertools.permutations(可迭代对象,组合个数)
产生指定数目的元素的所有排列(顺序有关)
from itertools import permutations
x = permutations(['A', 'B', 'C'], 3)
print(list(x)) # [('A', 'B', 'C'), ('A', 'C', 'B'), ('B', 'A', 'C'), ('B', 'C', 'A'), ('C', 'A', 'B'), ('C', 'B', 'A')]
itertools中combinations与permutations函数区别
import itertools
s = [1, 2, 3]
print(itertools.permutations(s, 2)) # 结果是一个迭代器
print(itertools.combinations(s, 2)) # 结果是一个迭代器
print(list(itertools.permutations(s, 2))) # [(1, 2), (1, 3), (2, 1), (2, 3), (3, 1), (3, 2)]
print(list(itertools.combinations(s, 2))) # [(1, 2), (1, 3), (2, 3)]
permutations和combinations都是得到一个迭代器。
combinations方法重点在组合,permutations方法重在排列。
更多:
https://www.jb51.net/article/123094.htm
https://www.liaoxuefeng.com/wiki/897692888725344/983420006222912
https://www.cnblogs.com/haiyan123/p/9804091.html