系列文章目录
【蓝桥杯学习笔记】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










