0
点赞
收藏
分享

微信扫一扫

【蓝桥杯学习笔记】8.itertools- 为高效循环而创建迭代器的函数

Resin_Wu 2022-04-03 阅读 117

系列文章目录

【蓝桥杯学习笔记】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(iterablekey=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(*iterablesrepeat=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(iterabler=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

举报

相关推荐

0 条评论