系列文章目录
【蓝桥杯学习笔记】1. 入门基本语法及练习题
【蓝桥杯学习笔记】2. 常用模型----最大公约数和最小公倍数
【蓝桥杯学习笔记】3. 质数判断
【蓝桥杯学习笔记】5. 矩阵乘法
【蓝桥杯学习笔记】6.一图看懂差分数组+《小明的彩灯》
【蓝桥杯学习笔记】7. 哈曼夫树
文章目录
前言
蓝桥本笔记-----从入门到放弃
本片文章使用Python语言编写----Now is better than never
一、itertools简介
itertools模块是python3的内置模块,它标准化了一个快速、高效利用内存的核心工具集,这些工具本身或组合都很有用。它们一起形成了“迭代器代数”,这使得在纯Python中有可能创建简洁又高效的专用工具。
二、分类
1.无限迭代器
迭代器 | 实参 | 结果 | |
---|---|---|---|
count() | start, [step] | start, start+step, start+2*step, ...无限次 | |
cycle() | p | p0, p1, ... plast, p0, p1, ...无限次 | |
repeat() | elem [,n] | elem, elem, elem, ... 重复无限次或n次 |
import itertools as Iter
for i in Iter.count(100,1): #从100开始无限以步长为1迭代下去
print(i) # 100 101 102 103 104 ........
for i in Iter.cycle('ABCD'):
print(i) # A B C D A B C D ........
for i in Iter.repeat(10, 3): # 第一个为迭代的元素(也可是列表);第二为循环次数
print(i) # 10 10 10
2.根据最短输入序列长度停止的迭代器:
这是从itertools函数文档 截取的根据最短输入序列长度停止的迭代器函数,我们主要介绍常用的前三个:
迭代器 | 实参 | 结果 | |
---|---|---|---|
accumulate() | p [,func] | p0, p0+p1, p0+p1+p2, ... | |
chain() | p, q, ... | p0, p1, ... plast, q0, q1, ... | |
groupby() | iterable[, key] | 根据key(v)值分组的迭代器 | |
chain.from_iterable() | iterable -- 可迭代对象 | p0, p1, ... plast, q0, q1, ... | |
compress() | data, selectors | (d[0] if s[0]), (d[1] if s[1]), ... | |
dropwhile() | pred, seq | seq[n], seq[n+1], ... 从pred首次真值测试失败开始 | |
filterfalse() | pred, seq | seq中pred(x)为假值的元素,x是seq中的元素。 | |
islice() | seq, [start,] stop [, step] | seq[start:stop:step]中的元素 | |
pairwise() | iterable -- 可迭代对象 | (p[0], p[1]), (p[1], p[2]) | |
starmap() | func, seq | func(*seq[0]), func(*seq[1]), ... | |
takewhile() | pred, seq | seq[0], seq[1], ..., 直到pred真值测试失败 | |
tee() | it, n | it1, it2, ... itn 将一个迭代器拆分为n个迭代器 | |
zip_longest() | p, q, ... | (p[0], q[0]), (p[1], q[1]), ... |
itertools.
accumulate
(iterable[, func, *, initial=None])
创建一个迭代器,返回累积汇总值或其他双目运算函数的累积结果值(通过可选的 func 参数指定)。
import itertools as Iter
import operator
data = [3, 4, 6, 2, 1, 9, 0, 7, 5, 8]
list(Iter.accumulate(data, operator.add)) # 累加
#[3, 7, 13, 15, 16, 25, 25, 32, 37, 45]
#实现 3,3+4,3+4+6,3+4+6+2 .........
list(Iter.accumulate(data, operator.mul)) # 累乘
#[3, 12, 72, 144, 144, 1296, 0, 0, 0, 0]
#实现 3,3x4,3x4x6,3x4x6x2 .........
list(Iter.accumulate(data, max)) # 最大值
#[3, 4, 6, 6, 6, 9, 9, 9, 9, 9]
#实现 3,4>3,6>4,6>2,6>1.......
cashflows = [1000, -90, -90, -90, -90]
list(accumulate(cashflows, lambda bal, pmt: bal*1.05 + pmt)) #自定义函数
#[1000, 960.0, 918.0, 873.9000000000001, 827.5950000000001]
#实现 1000,1000*1.05-90, 960*1.05-90,918*1.05-90 .....
itertools.
chain
(*iterables)
创建一个迭代器,它首先返回第一个可迭代对象中所有元素,接着返回下一个可迭代对象中所有元素,直到耗尽所有可迭代对象中的元素。可将多个序列处理为单个序列。
import itertools as Iter
for i in Iter.chain('ABC','DEF'): # A->B->C->D->E->F 相当于链表
print(i)
itertools.
groupby
(iterable, key=None)
可以把相邻元素按照 key 函数分组,并返回相应的 key 和 groupby,如果key函数为 None,则只有相同的元素才能放在一组。
import itertools as Iter
for key, group in Iter.groupby('AaaBBbcCAAa'):
print(list(group)) # 相邻的相同元素放一起
#['A']
#['a', 'a']
#['B', 'B']
#['b']
#['c']
#['C']
#['A', 'A']
#['a']
for key, group in Iter.groupby('AaaBBbcCAAa', lambda c: c.upper()):
print(list(group))# 相邻的相同元素以某种关系放一起如 A = upper('a')
#['A', 'a', 'a']
#['B', 'B', 'b']
#['c', 'C']
#['A', 'A', 'a']
3. 排列组合迭代器:
迭代器 | 实参 | 结果 |
---|---|---|
product() | p, q, ... [repeat=1] | 笛卡尔积,相当于嵌套的for循环 |
permutations() | p[, r] | 长度r元组,所有可能的排列,无重复元素 |
combinations() | p, r | 长度r元组,有序,无重复元素 |
combinations_with_replacement() | p, r | 长度r元组,有序,元素可重复 |
itertools.
product
(*iterables, repeat=1)
可迭代对象输入的笛卡儿积。
import itertools as Iter
for k in Iter.product('ABCD', repeat=2):
print(k)
('A', 'A')('A', 'B')('A', 'C')('A', 'D')('B', 'A')('B', 'B')('B', 'C')
('B', 'D')('C', 'A')('C', 'B')('C', 'C')('C', 'D')('D', 'A')('D', 'B')
('D', 'C')('D', 'D')
#相当于 repeat=2 为2次嵌套循环
for i in "ABCD":
for j in "ABCD":
-->(i,j)
itertools.
permutations
(iterable, r=None)
连续返回由 iterable 元素生成长度为 r 的排列。
import itertools as Iter
for k in Iter.permutations('ABCD', 2):#permutation 返回的是排列
print(k)
('A', 'B')('A', 'C')('A', 'D')
('B', 'A')('B', 'C')('B', 'D')
('C', 'A')('C', 'B')('C', 'D')
('D', 'A')('D', 'B')('D', 'C')
for k in Iter.combinations('ABCD', 2):#combinations 返回的是组合
print(k)
('A', 'B')('A', 'C')('A', 'D')
('B', 'C')('B', 'D')('C', 'D')
for k in Iter.combinations('ABCD', 2):#combinations_with_replacement 返回的是排列组合
print(k)
('A', 'A')('A', 'B')('A', 'C')('A', 'D')
('B', 'B')('B', 'C')('B', 'D')
('C', 'C')('C', 'D')('D', 'D')
总结
参考:itertools --- 为高效循环而创建迭代器的函数 — Python 3.10.4 文档https://docs.python.org/zh-cn/3/library/itertools.html#module-itertools