一、介绍
itertools 是python的迭代器模块,itertools提供的生成迭代器的函数,相当高效且节省内存。使用这些工具,你将能够创建自己定制的迭代器用于高效率的循环。
二、速查表
无限迭代器:
迭代器 |
参数 |
结果 |
例子 |
---|---|---|---|
start, [step] |
start, start+step, start+2*step, … |
|
|
p |
p0, p1, … plast, p0, p1, … |
|
|
elem [,n] |
elem, elem, elem, … endlessly or up to n times |
|
有限序列迭代器:
迭代器 |
参数 |
结果 |
例子 |
---|---|---|---|
p [,func] |
p0, p0+p1, p0+p1+p2, … |
|
|
p, q, … |
p0, p1, … plast, q0, q1, … |
|
|
iterable |
p0, p1, … plast, q0, q1, … |
|
|
data, selectors |
(d[0] if s[0]), (d[1] if s[1]), … |
|
|
pred, seq |
seq[n], seq[n+1], starting when pred fails |
|
|
pred, seq |
elements of seq where pred(elem) is false |
|
|
iterable[, key] |
sub-iterators grouped by value of key(v) |
||
seq, [start,] stop [, step] |
elements from seq[start:stop:step] |
|
|
func, seq |
func(*seq[0]), func(*seq[1]), … |
|
|
pred, seq |
seq[0], seq[1], until pred fails |
|
|
it, n |
it1, it2, … itn splits one iterator into n |
||
p, q, … |
(p[0], q[0]), (p[1], q[1]), … |
|
排列组合迭代器:
Iterator |
Arguments |
Results |
---|---|---|
p, q, … [repeat=1] |
cartesian product, equivalent to a nested for-loop |
|
p[, r] |
r-length tuples, all possible orderings, no repeated elements |
|
p, r |
r-length tuples, in sorted order, no repeated elements |
|
p, r |
r-length tuples, in sorted order, with repeated elements |
|
|
|
|
|
|
|
|
|
|
|
|
三、模块函数详细说明与使用
1、计数、几步
itertools.count(start=0, step=1)
- start:计数起始值。
- step:计数间隔。
说明:生成一个迭代器,该迭代器从start开始迭代,第i次迭代返回start+i*step。
代码示例:
import itertools #输出0-9的奇数 for i in itertools.count(1,2): print(i) if i==9 : break ''' 结果: 1 3 5 7 9 '''
2、无限循环(往复)迭代
itertools.cycle(iterable)
- iterable:可迭代对象。
说明: 把iterable变成无限循环迭代的迭代器,让iter不再只能迭代一轮。
代码示例:
import itertools j=0 #循环输出'abc'中的字母 for i in itertools.cycle('abc'): print(i) #第5步结束循环 j+=1 if j==5 : break ''' 结果: a b c a b '''
3、重复
itertools.repeat(object,times=None)
- object:一个对象用于重复。
- times:重复次数。
说明: 生成一个重复times次object的迭代器,若times=None则无限次重复。
代码示例:
import itertools for i in itertools.repeat('练习',3): print(i) ''' 结果: 练习 练习 练习 '''
4、迭代器拼接
itertools.chain(*iterables)
- *iterables:可以传入多个迭代器作为参数。
说明: 把传入的多个iterable拼接成一个迭代器,并且按传入顺序迭代。
itertools.chain.from_iterable(iterable)
- iterable:可迭代对象。
说明: 将iterable的元素进行拼接后生成迭代器,按iterable元素迭代顺序进行拼接,iterable的元素必须是可迭代的,例如含有可迭代对象的列表['abc',[1,2,3]]。
代码示例:
import itertools print('单独的迭代器拼接') for i in itertools.chain('abc',[1,2,3]): print(i) print('用iterable的元素拼接,iterable的元素必须为可迭代:') for i in itertools.chain.from_iterable(['abc',[1,2,3]]): print(i) ''' 结果: 单独的迭代器拼接 a b c 1 2 3 用该列表的元素拼接,列表元素必须为可迭代器: a b c 1 2 3 '''
5、数据选择、筛选
itertools.compress(data,selector)
- data:一个可以用来迭代的数据。
- selector:选择器,用来对data进行筛选。
说明: 生成一个筛选之后的迭代器,筛选规则为,当selector的第i个值为真,则保留data的第i个值,否则去除data的第i个值,类似于numpy.where(),但是不要求selector于data有相同的迭代长度。
代码示例:
import itertools #data长度为5,selector长度为3 for i in itertools.compress([1,2,3,4,5,6],[1,0,1]): print(i) ''' 结果: 1 3 '''
6、数据剔除
dropwhile(predicate, iterable)
- predicate:一个判断函数,该函数返回值类型为bool。
- iterable:可迭代对象。
说明:将iterable中的元素传入predicate中作为predicate的参数,若predicate返回True则去除,若predicate返回Flase则保留,最后生成一个迭代器。
代码示例:
import itertools #去除小于3的数 for i in itertools.dropwhile(lambda x:x<3,[1,2,3,4,5]): print(i) ''' 结果: 3 4 5 '''
7、相邻数据分组
groupby(iterable, key=None)
- iterable:可迭代对象。
- key:一个函数,将iterable的元素传入作为参数。
说明:把迭代器中相邻的重复元素挑出来放在一起,挑选规则是通过key函数完成的,只要作用于函数的两个元素返回的值相等,这两个元素就被认为是在一组的,而函数返回值作为组的key。如果我们要忽略大小写分组,就可以让元素'A'
和'a'
都返回相同的key。groupby是一个迭代器类,每次迭代有两个返回值,一个是key函数的返回值,一个是临近的同组元素的迭代器。
代码示例:
import itertools #将字符串元素转换为大写后,相邻字符相同的组成一组 for i,j in itertools.groupby('AaBbA',lambda x:x.upper()): #i是lambda匿名函数返回的结果,j是函数处理之后的同组元素迭代器 print('%s:%s'%(i,list(j))) ''' 结果: A:['A', 'a'] B:['B', 'b'] A:['A'] '''
8、数据过滤
filterflase(predicate, iterable)
- predicate:断言,一个判断函数,该函数返回值类型为bool。
- iterable:可迭代对象。
说明:将iterable的元素不满足predicate的元素去除过滤之后生成一个迭代器。
代码示例:
import itertools #生成迭代器,其元素不包含原序列小于3的数据 for i in itertools.filterfalse(lambda x:x<3,[1,2,3,4,5]): print(i) ''' 结果: 3 4 5 '''
9、数据切片
islice(iterable, start, stop[, step])
- iterable:可迭代对象。
- start:起始索引。
- stop:结束索引。
- step:间隔。
说明:对iterable进行切片,参考函数slice。
代码示例:
import itertools #生成迭代器,其元素不包含原序列小于3的数据 for i in itertools.islice([0,1,2,3,4,5],2,4,2): print(i) ''' 结果: 3 4 5 '''
10、数据映射
startmap(func,iterable)
- func:函数,用来对iterable的每个元素进行操作。
- iterable:可迭代对象。
说明:对iterable进行映射操作,参考map函数。两者区别在于func有多个参数时,startmap为func(*arg)用的是可变参数,map为func(arg1,arg2)用的是位置参数
代码示例:
import itertools #生成迭代器,其元素为原来元素之和的映射 for i in itertools.starmap(lambda x,y:x+y,[(1,1),(2,2),(3,3)]): print(i) ''' 结果: 2 4 6 '''
11、迭代器复制
tee(iterable,n=2)
- iterable:可迭代对象。
- n:要复制的个数。
说明:对iterable进行复制,生成n的相同的iterable。
代码示例:
import itertools #复制迭代器 i,j,k=itertools.tee(iter('abc'),3) print(list(i)) print(list(j)) print(list(k)) ''' 结果: ['a', 'b', 'c'] ['a', 'b', 'c'] ['a', 'b', 'c'] '''
12、数据选取
takewhile(predicate, iterable)
- predicate:要复制的个数。
- iterable:可迭代对象。
说明:将iterable中的元素提取出来生,直到不满足predicate就结束,类似于while循环。
代码示例:
import itertools #复制迭代器 for i in itertools.takewhile(lambda x:x<3,[1,2,3,4,3,2,1]): print(i) ''' 结果: 1 2 '''
13、数据连接
izip_longest(*iterables, fillvalue=None)
- *iterables:需要连接的可迭代器。
- fillvalue:当连接的内容为空时的填充值,如:x=[1,2],y=[1],fillvalue=‘-’,list(izip_longest(x,y,'-'))则返回结果为[(1,1),(2,-)]。
说明:将多个iterable的元素按顺序用元组的形式连接,类似zip。
代码示例:
import itertools #复制迭代器 for i,j in itertools.zip_longest('abc','12',fillvalue='nan'): print(i,j) ''' 结果: a 1 b 2 c nan '''
13、数据笛卡尔积
product(*iterables,repeat)
- *iterables:需要笛卡尔积运算的可迭代器。
- repeat:将所有iterable重复repeat个之后再进行笛卡尔积,默认不重复。
说明:将多个iterable的元素进行笛卡尔积。
代码示例:
import itertools print('不重复:') for i in itertools.product('ab','12'): print(i) print('重复2次:') for i in itertools.product('ab',repeat=2): print(i) ''' 结果: 不重复: ('a', '1') ('a', '2') ('b', '1') ('b', '2') 重复2次: ('a', 'a') ('a', 'b') ('b', 'a') ('b', 'b') '''
14、元素的组合
itertools.combinations(iterable, r)
- iterable:一个可迭代对象。
- r:取tierable对象中r个元素进行组合。
说明:生成一个迭代器,该迭代器将tierable的r个元素进行所有可能的组合,每次迭代只返回一个组合,迭代器可以用list()转换成列表。
代码示例:
import itertools
x=[1,2,3]
combin_1=itertools.combinations(x,1) #取1个数进行组合,生成的时一个迭代器
combin_2=itertools.combinations(x,2) #取2个数进行组合,生成的是一个迭代器
print('combin_1:',list(combin_1)) #将迭代器转为列表并打印
print('\ncombin_1、combin_2的数据类型:',type(combin_1))
print('\n输出迭代器每次迭代内容:')
for i in combin_2:
print(i)
'''
结果:
combin_1: [(1,), (2,), (3,)]
combin_1、combin_2的数据类型: <class 'itertools.combinations'>
输出迭代器每次迭代内容:
(1, 2)
(1, 3)
(2, 3)
'''
15、数据的排列
itertools.combinations(iterable, r)
- iterable:一个可迭代对象。
- r:取tierable对象中r个元素进行组合。
说明:生成一个迭代器,该迭代器将tierable的r个元素进行所有可能的排列,每次迭代只返回一个排列。
代码示例:
import itertools
x=[1,2,3]
combin_1=itertools.permutations(x,1) #取1个数进行组合,生成的时一个迭代器
combin_2=itertools.permutations(x,2) #取2个数进行组合,生成的是一个迭代器
print('combin_1:',list(combin_1)) #将迭代器转为列表并打印
print('\ncombin_1、combin_2的数据类型:',type(combin_1))
print('\n输出迭代器每次迭代内容:')
for i in combin_2:
print(i)
'''
结果:
combin_1: [(1,), (2,), (3,)]
combin_1、combin_2的数据类型: <class 'itertools.permutations'>
输出迭代器每次迭代内容:
(1, 2)
(1, 3)
(2, 1)
(2, 3)
(3, 1)
(3, 2)
'''