Fork me on GitHub

python学习--itertools模块

python学习:itertools

itertools模块包含一系列迭代数据集的函数,如下三个表格:

iterators

下面挑常用的举例学习一下:

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/

转载请注明出处:BackNode

My zhiFuBao

Buy me a cup of coffee

blogroll

social