python学习:itertools
itertools模块包含一系列迭代数据集的函数,如下三个表格:
下面挑常用的举例学习一下:
itertools.count(start=0,step=1)和itertools.izip(*iterables)
count()函数生成从start(default=0)开始的以step(default=1)为步长的连续整数, izip()函数将多个迭代器中的元素合并为一个元组并作为一个迭代器返回,类似于zip()函数 使用:
In [1]: from itertools import *
In [2]: for i in izip(count(7,2),['a','b','c']):
...: print i
...:
(7, 'a')
(9, 'b')
(11, 'c')
itertools.cycle(iterable)
cycle()函数返回一个迭代器,这个迭代器循环重复参数内容,使用:
In [4]: for i in izip(cycle(['a','b']),[1,2,3,4,5,6]):
...: print i
...:
('a', 1)
('b', 2)
('a', 3)
('b', 4)
('a', 5)
('b', 6)
itertools.repeat(elem,n)
repeat()函数返回一个迭代去,这个迭代器将重复elem元素n次,使用:
In [5]: for i in izip(repeat(9,6),[1,2,3,4,5,6]):
...: print i
...:
(9, 1)
(9, 2)
(9, 3)
(9, 4)
(9, 5)
(9, 6)
itertools.imap(function,*iterables)
创建一个迭代器,生成项function(i1, i2, ..., iN),其中i1,i2...iN分别来自迭代器iter1,iter2 ... iterN,如果function为None,则返回(i1, i2, ..., iN)形式的元组,只要提供的迭代器中任意一个迭代器不再生成值,迭代就会停止。 repeat结合imap使用:
In [9]: for i in imap(lambda x,y:(x,y,x*y),repeat(3),xrange(4)):
...: print "{} * {} = {}".format(i[0],i[1],i[2])
...:
3 * 0 = 0
3 * 1 = 3
3 * 2 = 6
3 * 3 = 9
itertools.chain(*iterables)
正如chain()函数的名字一样,它将多个迭代器链起来,返回一个迭代器,这个迭代器中包含所有参数迭代器的内容,使用:
In [10]: for i in chain([1,2],['a','b'],['X','Y']):
...: print i
...:
1
2
a
b
X
Y
itertools.compress(data,selectors)
根据selectors对data进行筛选
def compress(data, selectors):
# compress('ABCDEF', [1,0,1,0,1,1]) --> A C E F
return (d for d, s in izip(data, selectors) if s)
itertools.dropwhile(predicate,iterable)
当predicate为True时,则drop掉iterable中的元素;一旦predicate为False,则返回iterable中的当前元素和后续元素,使用:
In [11]: for i in dropwhile(lambda x:x<3,[1,2,3,4,5,6]):
...: print i
...:
3
4
5
6
参考
1.http://wklken.me/posts/2013/08/20/python-extra-itertools.html
2.https://docs.python.org/2/library/itertools.html
3.http://pymotw.com/2/itertools/