一、介绍
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)
'''