Python的itertools模块

本文深入解析Python的itertools模块,涵盖无限迭代器、处理短输入文本的迭代器及组合迭代器的功能与应用实例,如count(), cycle(), repeat(), accumulate(), chain(), compress(), dropwhile(), filterfalse(), groupby(), islice(), starmap(), takewhile(), tee(), zip_longest(), product(), permutations(), combinations(), combinations_with_replacement()等函数的使用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这篇文章参考的是Python3官方文档,应该说是翻译文档。

https://docspy3zh.readthedocs.io/en/latest/library/itertools.html#itertools.cycle

itertools模块实现了一些迭代器的构建块,它标准化了一组快速、内存高效的工具。

itertools模块中有三种迭代器生产工具:无限迭代器、处理短输入文本的迭代器、组合迭代器。

无限迭代器:

迭代器参数结果例子
count()start,[step]start, start+step, start+2*step, …count(10) --> 10 11 12 13 14 …
cycle()pp0, p1, … plast, p0, p1, …cycle(‘ABCD’) --> A B C D A B C D …
repeat()elem [,n]elem, elem, elem, … 无穷尽或者达到n次repeat(10, 3) --> 10 10 10

处理短输入文本的迭代器

迭代器参数结果例子
accumulate()pp0, p0+p1, p0+p1+p2, …accumulate([1,2,3,4,5]) --> 1 3 6 10 15
chain()p, q, …p0, p1, … plast, q0, q1, …chain(‘ABC’, ‘DEF’) --> A B C D E F
compress()data, selectors(d[0] if s[0]), (d[1] if s[1]), …compress(‘ABCDEF’, [1,0,1,0,1,1]) --> A C E F
dropwhile()pred, seqseq[n], seq[n+1], 当pred为false时开始返回dropwhile(lambda x: x<5, [1,4,6,4,1]) --> 6 4 1
filterfalse()pred, seq返回满足pred(elem)为false的元素filterfalse(lambda x: x%2, range(10)) --> 0 2 4 6 8
groupby()iterable[, keyfunc]sub-iterators grouped by value of keyfunc(v)
islice()seq, [start,] stop [, step]elements from seq[start:stop:step]islice(‘ABCDEFG’, 2, None) --> C D E F G
starmap()func, seqfunc(*seq[0]), func(*seq[1]), …starmap(pow, [(2,5), (3,2), (10,3)]) --> 32 9 1000
takewhile()pred, seqseq[0], seq[1], until pred failstakewhile(lambda x: x<5, [1,4,6,4,1]) --> 1 4
tee()it, nit1, it2 , … itn splits one iterator into n
zip_longest()p, q, …(p[0], q[0]), (p[1], q[1]), …zip_longest(‘ABCD’, ‘xy’, fillvalue=’-’) --> Ax By C- D-

组合迭代器

迭代器参数结果
product()p, q, … [repeat=1]笛卡尔积,相当于嵌套了for循环
permutations()p[, r]长度为r的元组所有的排序,没有重复
combinations()p, r长度为r的元组,按顺序排序,无重复
combinations_with_replacement()p, r长度为r的元组,按顺序排序,有重复

给出上述四个函数的使用例子:

product('ABCD', repeat=2)    -->AA AB AC AD BA BB BC BD CA CB CC CD DA DB DC DD    

permutations('ABCD', 2)      -->AB AC AD BA BC BD CA CB CD DA DB DC  

combinations('ABCD', 2)      -->AB AC AD BC BD CD    

combinations_with_replacement('ABCD', 2)    -->AA AB AC AD BB BC BD CC CD DD 

函数介绍

函数的使用方法上述表格给出的例子简洁明了的说明了,下面选择性的对几个函数进一步解释。

itertools.accumulate(iterable)

构建一个返回累积和的迭代器。元素可以是任意可加的小数或分数。它就相当于:

def accumulate(iterable):
	'Return running totals'
	#accumulate([1,2,3,4,5])-->1 3 6 10 15
	it=iter(iterable)
	total=next(it)
	yield total
	for element in it:
		total=total+element
		yield total

itertools.chain(*iterables)

构建一个迭代器,它返回第一个可迭代对象的元素直至完全,然后继续下一个可迭代对象。将多个序列当作单个序列处理。相当于:

def chain(*iterables):
	#chain('ABC','DEF')-->A B C D E F  
	for it in iterables:
		for element in it:
			yield element

itertools.combinations(iterable, r)

从输入的可迭代对象的元素中返回r长度的子序列。组合按字典的顺序给出,若输入的可迭代对象是排序的,则组合的元组也是排序的。元素被视为独特的是因为它们的位置,而不是值。因此,如果输入元素是唯一的,则每个组合中不会有重复值。

itertools.count(start=0, step=1)

创建一个迭代器,该迭代器返回以n开头的等间隔值。通常用作map()的参数,以生成连续的数据点。另外,与zip()一起使用来添加序列号。相当于:

def count(start=0,step=1):
	#count(10) -->10 11 12 13 14...
	#count(2.5,0.5) -->2.5 3.0 3.5...
	n=start
	while True:
		yield n
		n+=step

itertools.cycle(iterable)

构建一个迭代器,该迭代器返回可迭代对象的元素并且保存副本,当可迭代对象迭代完后,从保存的副本中返回元素。无限期重复。

itertools.islice(iterable, [start, ]stop[, step])

生成一个迭代器,它从可迭代对象中返回选定元素。start为开始迭代的位置,step为步长,stop为迭代结束的位置。若stop为None,则迭代继续直至迭代器耗尽。和常规切片不同的是,这三个参数都不支持负数。

itertools.dropwhile(predicate, iterable)

构建一个迭代器,只要断言为真,则删除元素;之后返回每个元素。注意,该迭代器不产生任意输出直到断言为false。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值