itertools模块是python内置的迭代器模块,主要用于迭代器的定制。这一篇书接上文,继续对有限迭代器的相关内容进行进一步的介绍,依然是介绍其常见的一些使用方法以及应用场景。另外,由于方法众多,所以分了上下两篇予以介绍。
1.有限序列迭代器
1.1 groupby函数
groupby( iterable, key=None):
iterable:一个可迭代对象
key:一个函数,将iterable的元素作为参数
把迭代器中相邻的重复元素挑选出来放在一起,挑选规则是通过key函数完成的。只要作用于key函数的两个元素的返回值相同,那么我们就认为这两个元素时一组的。该函数有两个返回值,一个是key函数的返回值,另一个是临近的同组元素的迭代器
from itertools import groupby
for key, value in groupby('AaBbA', lambda x: x.upper()):
print(f"key = {key}, value={list(value)}")
result:
key = A, value=['A', 'a']
key = B, value=['B', 'b']
key = A, value=['A']
1.2 islice函数
islice(iterable, start, stop[, step]):
iterable:一个可迭代对象
start:起始索引
stop:结束索引
step:间隔
对iterable进行切片操作
from itertools import islice
for i in islice([0, 1, 2, 3, 4, 5], 1, 5, 2):
print(i)
result:
1
3
迭代器和生成器不能使用标准的切片操作,因为它们的长度事先我们并不知道(并 且也没有实现索引)。函数islice() 返回一个可以生成指定元素的迭代器,它通过遍 历并丢弃直到切片开始索引位置的所有元素。然后才开始一个个的返回元素,并直到切 片结束索引位置。
这里要着重强调的一点是islice() 会消耗掉传入的迭代器中的数据。必须考虑到 迭代器是不可逆的这个事实。所以如果你需要之后再次访问这个迭代器的话,那你就得 先将它里面的数据放入一个列表中。
1.3 startmap函数
startmap(iterable[, func]):
iterable:一个可迭代对象
func: 一个函数,将iterable的元素作为参数
创建一个迭代器,迭代器中的每个值为func(*item), item来自iterable。类似于map()函数。两者区别在于func有多个参数时,startmap为func(*arg)用的是可变参数,map为func(arg1,arg2)用的是位置参数
from itertools import starmap
values = [(0, 5), (1, 6), (2, 7), (3, 8), (4, 9)]
for i in starmap(lambda x, y: (x, y, x * y), values):
print('%d * %d = %d' % i)
result:
0 * 5 = 0
1 * 6 = 6
2 * 7 = 14
3 * 8 = 24
4 * 9 = 36
1.4 takewhile函数
takewhile(predicate, iterable):
predicate:一个判断函数,它的返回值是一个bool类型
iterable:一个可迭代对象
将iterable的元素依次代入predicate进行判断,若结果为False则去除,为True则予以保留。最后生成一个新的迭代器。其作用和dropwhile()函数相反
from itertools import takewhile
for i in takewhile(lambda x: x < 3, [1, 2, 3, 4, 5]):
print(i)
result:
1
2
1.5 tee函数
tee(iterable,n=2)
iterable:可迭代对象。 n:要复制的个数。
说明:对iterable进行复制,生成n的相同的iterable。
from itertools import tee
for i in tee([1, 2, 3, 4, 5], 3):
print(list(i))
result:
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
1.6 zip_longest函数
与zip一样,都是将序列组合成元组,zip返回的是元组列表,izip_longest返回的是迭代器,所以效率更高。组合时,izip_longest以最长序列为准,默认补充位是None。
zip_longest(*iterables,fillvalue=None)
from itertools import zip_longest
print(list(zip_longest([1,2,3,4], 'ABC', 'xy', fillvalue='0')))
result:
[(1, 'A', 'x'), (2, 'B', 'y'), (3, 'C', '0'), (4, '0', '0')]