Python-标准库之迭代器-itertools
2021/8/18 14:36:05
本文主要是介绍Python-标准库之迭代器-itertools,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
-
Infinite iterators: 无穷迭代器
count(start=0, step=1) --> start, start+step, start+2*step, ... -->返回从1开始的无限个自然数序列,
# res = itertools.count(1) # for n in res: # print(n) #不敢执行 #解决方案:takewhile():与无穷迭代器连用,生成符合条件的序列 res = itertools.count(1) fn = itertools.takewhile(lambda x: x <= 10, res) #返回小于等于10的自然数序列 print(list(fn)) #执行结果: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
cycle(p) --> p0, p1, ... plast, p0, p1, ... -->把传入的序列无限循环
res = itertools.cycle('ABC') # for i in res: # print(i) #不敢执行 #执行结果:A B C A B C
repeat(elem [,n]) --> elem, elem, elem, ... endlessly or up to n times -->把一个元素无限重复,提供第二个参数可以限制重复次数
res = itertools.repeat('A',5) for i in res: print(i,end=',',flush=True) #执行结果:A,A,A,A,A
-
Iterators terminating on the shortest input sequence: -->根据最短输入序列长度停止的迭代器
accumulate(p[, func]) --> p0, p0+p1, p0+p1+p2 -->返回累积汇总值(即后面的数等于前面的数的累加结果值)
#accumulate(iterable, func=operator.add, *, initial=None):返回累积汇总值(即后面的数等于前面的数的累加结果值)或其他给定函数的累积结果值,如果提供initial,即从初始值开始 #与functools.reduce()区别在于reduce只返回最终累积值 res = itertools.accumulate([1, 2, 3, 4, 5, 6, 6, 7, 8, 9 ,10]) print(list(res)) #执行结果: [1, 3, 6, 10, 15, 21, 27, 34, 42, 51, 61] res = itertools.accumulate([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], func=operator.mul) #累积乘积 print(list(res)) #执行结果: [1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800] res = itertools.accumulate([1, 2, 3, 4, 5, 6, 6, 7, 8, 9 ,10], initial=5) #从5开始加1,加2.... print(list(res)) #执行结果: [5, 6, 8, 11, 15, 20, 26, 32, 39, 47, 56, 66]
chain(p, q, ...) --> p0, p1, ... plast, q0, q1, ... : -->p ,q为可迭代对象,将两个或几个可迭代对象中所有的元素合并
res = itertools.chain('abc','def') for i in res: print(i, end=',', flush=True) #执行结果: a,b,c,d,e,f res = itertools.chain([1, 2, 3], [4, 5, 6]) for i in res: print(f"两个列表分别拆分并组合的结果为: {i}") #执行结果为: 1 2 3 4 5 6
chain.from_iterable([p, q, ...]) --> p0, p1, ... plast, q0, q1, ... -->将一个可迭代对象内部迭代,返回这个可迭代对象中所有的元素
#chain.from_iterable(iterable): 将一个可迭代对象内部迭代,返回这个可迭代对象中所有的元素 res = itertools.chain.from_iterable(["ABC", "DEF"]) for i in res: print(i, end=',', flush=False) #执行结果: A,B,C,D,E,F
compress(data, selectors) --> (d[0] if s[0]), (d[1] if s[1]), ... -->创建一个迭代器,它返回 data 中经 selectors 真值测试为 True 的元素。迭代器在两者较短的长度处停止。
res = itertools.compress(data="ABCDEFG",selectors=[1, 0, 1, 0, 1, 1]) #1为True, 0为False print(list(res)) #执行结果: ['A', 'C', 'E', 'F']
dropwhile(pred, seq) --> seq[n], seq[n+1], starting when pred fails -->当序列不满足条件时返回该元素,之后的元素不作处理
groupby(iterable[, keyfunc]) --> sub-iterators grouped by value of keyfunc(v) -->返回 iterable 中连续的键和组
#groupby(): 把迭代器中相邻的重复元素挑出来放在一起: res = itertools.groupby("AAABBBCCDDDDAAB") for key,group in res: print(key, list(group)) """ 执行结果: A ['A', 'A', 'A'] B ['B', 'B', 'B'] C ['C', 'C'] D ['D', 'D', 'D', 'D'] A ['A', 'A'] B ['B'] """ #groupby(): 使用函数,忽略大小写,让相同元素大小写key相同 res = itertools.groupby("AaaaBBbcCAAa", lambda x: x.upper()) for key, group in res: print(key, list(group)) """ 执行结果: A ['A', 'a', 'a', 'a'] B ['B', 'B', 'b'] C ['c', 'C'] A ['A', 'A', 'a'] """
filterfalse(pred, seq) --> elements of seq where pred(elem) is False -->返回 iterable 中 predicate(基于所写函数之上) 为 False 的元素
res = itertools.filterfalse(lambda x: x % 2, range(10)) print(list(res)) #执行结果: [0, 2, 4, 6, 8]
islice(seq, [start,] stop [, step]) --> elements from -->相当于切片,返回从 iterable 里选中的元素,但与切片不同的时,不支持负值 seq[start:stop:step]
#islice(iterable,stop) 相当于切片,返回从 iterable 里选中的元素,但与切片不同的时,不支持负值 #islice(iterable,start,stop[,step]) res = itertools.islice('ABCDEFGH',3) res1 = itertools.islice('ABCDEFGH',2,7,2) #start=2,stop=7,step=2 print(list(res)) #['A', 'B', 'C'] print(list(res1)) #['C', 'E', 'G']
starmap(fun, seq) --> fun(*seq[0]), fun(*seq[1]), ... -->使用从可迭代对象中获取的参数来计算该函数
#startmap(function,iterable): 使用从可迭代对象中获取的参数来计算该函数 res = itertools.starmap(pow, [(2, 5), (3, 3), (4, 4)]) #返回序列的次幂值 print(list(res)) #执行结果: [32, 27, 256]
takewhile(pred, seq) --> seq[0], seq[1], until pred fails -->与无穷迭代器count连用,生成符合条件的序列
res = itertools.count(1) fn = itertools.takewhile(lambda x: x <= 10, res) #返回小于等于10的自然数序列 print(list(fn)) #执行结果: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
zip_longest(p, q, ...) --> (p[0], q[0]), (p[1], q[1]), ... -->相同长度的可迭代对象元素组合,超出部分用fillvalue对应值填充缺失
#zip_longest(iterables,fillvalue=None):相同长度的可迭代对象元素组合,超出部分用fillvalue对应值填充缺失 res = itertools.zip_longest('ABCDEF', 'XY',fillvalue='-') print(list(res)) #执行结果:[('A', 'X'), ('B', 'Y'), ('C', '-'), ('D', '-'), ('E', '-'), ('F', '-')]
-
Combinatoric generators: 组合生成器
product(p, q, ... [repeat=1]) --> cartesian product -->可迭代对象输入的笛卡儿积
#product(iterable,repeat=1):返回可迭代对象的笛卡尔积 res = itertools.product('ABCD','XY') print(list(res)) #执行结果: [('A', 'X'), ('A', 'Y'), ('B', 'X'), ('B', 'Y'), ('C', 'X'), ('C', 'Y'), ('D', 'X'), ('D', 'Y')]
permutations(p[, r]) -->排列:连续返回由 iterable 元素生成长度为 r 的排列(已按字母顺序排列的子序列)
combinations(p, r) -->组合:返回由输入 iterable 中元素组成长度为 r 的子序列,每个元素间不重复
res = itertools.combinations(iterable='ABCD',r=2) print(list(res)) #执行结果: [('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'C'), ('B', 'D'), ('C', 'D')] res = itertools.combinations(iterable=range(4), r=3) for i in res: print(i) #执行结果: (0, 1, 2)(0, 1, 3)(0, 2, 3)(1, 2, 3)
combinations_with_replacement(p, r) -->允许重复元素的组合:返回由输入 iterable 中元素组成的长度为 r 的子序列,允许每个元素可重复出现
-
more_itertools
#more_itertools #一个值与可迭代对象合并 res = more_itertools.prepend(1, [3, 4, 5, 6]) for i in res: print(i) #执行结果: 1 3 4 5 6
-
相关示例:
#练习 """ def pi(N): ' 计算pi的值 ' # step 1: 创建一个奇数序列: 1, 3, 5, 7, 9, ... # step 2: 取该序列的前N项: 1, 3, 5, 7, 9, ..., 2*N-1. # step 3: 添加正负符号并用4除: 4/1, -4/3, 4/5, -4/7, 4/9, ... # step 4: 求和: return 3.14 """ def pi(N): res = itertools.count(start=1,step=2) #创建奇数列 fn = itertools.takewhile(lambda x: x <= 2*N-1, res) #取该数列的前N项 sum = 0 for i , value in enumerate(fn): sum += (-1)**i / value * 4 #添加正负符号并用4除 ,求和 return sum print(pi(10)) print(pi(100)) print(pi(1000)) #执行结果: 3.14
这篇关于Python-标准库之迭代器-itertools的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-24Python编程入门指南
- 2024-12-24Python编程基础入门
- 2024-12-24Python编程基础:变量与数据类型
- 2024-12-23使用python部署一个usdt合约,部署自己的usdt稳定币
- 2024-12-20Python编程入门指南
- 2024-12-20Python编程基础与进阶
- 2024-12-19Python基础编程教程
- 2024-12-19python 文件的后缀名是什么 怎么运行一个python文件?-icode9专业技术文章分享
- 2024-12-19使用python 把docx转为pdf文件有哪些方法?-icode9专业技术文章分享
- 2024-12-19python怎么更换换pip的源镜像?-icode9专业技术文章分享