Python itertools用法

轉自http://www.cnblogs.com/cython/articles/2169009.html

itertools模塊包含創建有效迭代器的函數,可以用各種方式對數據進行循環操作,此模塊中的所有函數返回的迭代器都可以與for循環語句以及其他包含迭代器(如生成器和生成器表達式)的函數聯合使用。

chain(iter1, iter2, ..., iterN):

給出一組迭代器(iter1, iter2, ..., iterN),此函數創建一個新迭代器來將所有的迭代器鏈接起來,返回的迭代器從iter1開始生成項,知道iter1被用完,然後從iter2生成項,這一過程會持續到iterN中所有的項都被用完。

View Code
複製代碼
 1 from itertools import chain
 2 test = chain('AB', 'CDE', 'F')
 3 for el in test:
 4 print el
 5 
 6 A
 7 B
 8 C
 9 D
10 E
11 F
複製代碼

chain.from_iterable(iterables):

一個備用鏈構造函數,其中的iterables是一個迭代變量,生成迭代序列,此操作的結果與以下生成器代碼片段生成的結果相同:

View Code
複製代碼
 1 >>>def f(iterables):
 2 for x in iterables:
 3 for y in x:
 4 yield y
 5 
 6 >>> test = f('ABCDEF')
 7 >>> test.next()
 8 'A'
 9 
10 
11 >>>from itertools import chain
12 >>> test = chain.from_iterable('ABCDEF')
13 >>> test.next()
14 'A'
複製代碼


combinations(iterable, r):

創建一個迭代器,返回iterable中所有長度爲r的子序列,返回的子序列中的項按輸入iterable中的順序排序:

View Code
複製代碼
 1 >>>from itertools import combinations
 2 >>> test = combinations([1,2,3,4], 2)
 3 >>>for el in test:
 4 print el
 5 
 6     
 7 (1, 2)
 8 (1, 3)
 9 (1, 4)
10 (2, 3)
11 (2, 4)
12 (3, 4)
複製代碼

count([n]):

創建一個迭代器,生成從n開始的連續整數,如果忽略n,則從0開始計算(注意:此迭代器不支持長整數),如果超出了sys.maxint,計數器將溢出並繼續從-sys.maxint-1開始計算。

cycle(iterable):

創建一個迭代器,對iterable中的元素反覆執行循環操作,內部會生成iterable中的元素的一個副本,此副本用於返回循環中的重複項。

dropwhile(predicate, iterable):

創建一個迭代器,只要函數predicate(item)爲True,就丟棄iterable中的項,如果predicate返回False,就會生成iterable中的項和所有後續項

View Code
複製代碼
1 def dropwhile(predicate, iterable):
2 # dropwhile(lambda x: x<5, [1,4,6,4,1]) --> 6 4 1
3     iterable = iter(iterable)
4 for x in iterable:
5 ifnot predicate(x):
6 yield x
7 break
8 for x in iterable:
9 yield x
複製代碼

groupby(iterable [,key]):

創建一個迭代器,對iterable生成的連續項進行分組,在分組過程中會查找重複項。

如果iterable在多次連續迭代中生成了同一項,則會定義一個組,如果將此函數應用一個分類列表,那麼分組將定義該列表中的所有唯一項,key(如果已提供)是一個函數,應用於每一項,如果此函數存在返回值,該值將用於後續項而不是該項本身進行比較,此函數返回的迭代器生成元素(key, group),其中key是分組的鍵值,group是迭代器,生成組成該組的所有項。

ifilter(predicate, iterable):

創建一個迭代器,僅生成iterable中predicate(item)爲True的項,如果predicate爲None,將返回iterable中所有計算爲True的項。

ifilter(lambda x: x%2, range(10)) -->13579

 

ifilterfalse(predicate, iterable):

創建一個迭代器,僅生成iterable中predicate(item)爲False的項,如果predicate爲None,則返回iterable中所有計算爲False的項。

ifilterfalse(lambda x: x%2, range(10)) --> 0 2468

 

imap(function, iter1, iter2, iter3, ..., iterN)

創建一個迭代器,生成項function(i1, i2, ..., iN),其中i1,i2...iN分別來自迭代器iter1,iter2 ... iterN,如果function爲None,則返回(i1, i2, ..., iN)形式的元組,只要提供的一個迭代器不再生成值,迭代就會停止。

複製代碼
 1 >>>from itertools import*
 2 >>> d = imap(pow, (2,3,10), (5,2,3))
 3 >>>for i in d: print i
 4   
 5 32
 6 9
 7 1000
 8   
 9 ####
10 >>> d = imap(pow, (2,3,10), (5,2))
11 >>>for i in d: print i
12  
13 32
14 9
15 
16 ####
17 >>> d = imap(None, (2,3,10), (5,2))
18 >>>for i in d : print i
19  
20  (2, 5)
21  (3, 2)
複製代碼

 

islice(iterable, [start, ] stop [, step]):

創建一個迭代器,生成項的方式類似於切片返回值: iterable[start : stop : step],將跳過前start個項,迭代在stop所指定的位置停止,step指定用於跳過項的步幅。與切片不同,負值不會用於任何start,stop和step,如果省略了start,迭代將從0開始,如果省略了step,步幅將採用1.

View Code
複製代碼
def islice(iterable, *args):
      # islice('ABCDEFG', 2) --> A B
# islice('ABCDEFG', 2, 4) --> C D
# islice('ABCDEFG', 2, None) --> C D E F G
# islice('ABCDEFG', 0, None, 2) --> A C E G
      s = slice(*args)
      it = iter(xrange(s.start or 0, s.stop or sys.maxint, s.step or1))
      nexti = next(it)
      for i, element in enumerate(iterable):
         if i == nexti:
             yield element
             nexti = next(it)
 
 #If start is None, then iteration starts at zero. If step is None, then the step defaults to one.
15#Changed in version 2.5: accept None values for default start and step.
複製代碼

 

izip(iter1, iter2, ... iterN):

創建一個迭代器,生成元組(i1, i2, ... iN),其中i1,i2 ... iN 分別來自迭代器iter1,iter2 ... iterN,只要提供的某個迭代器不再生成值,迭代就會停止,此函數生成的值與內置的zip()函數相同。

View Code
1 def izip(*iterables):
2 # izip('ABCD', 'xy') --> Ax By
3      iterables = map(iter, iterables)
4 while iterables:
5 yield tuple(map(next, iterables))

 

izip_longest(iter1, iter2, ... iterN, [fillvalue=None]):

與izip()相同,但是迭代過程會持續到所有輸入迭代變量iter1,iter2等都耗盡爲止,如果沒有使用fillvalue關鍵字參數指定不同的值,則使用None來填充已經使用的迭代變量的值。

View Code
複製代碼
 1 def izip_longest(*args, **kwds):
 2 # izip_longest('ABCD', 'xy', fillvalue='-') --> Ax By C- D-
 3       fillvalue = kwds.get('fillvalue')
 4 def sentinel(counter = ([fillvalue]*(len(args)-1)).pop):
 5 yield counter()         # yields the fillvalue, or raises IndexError
 6       fillers = repeat(fillvalue)
 7       iters = [chain(it, sentinel(), fillers) for it in args]
 8 try:
 9 for tup in izip(*iters):
10 yield tup
11 except IndexError:
12 pass
複製代碼

 

permutations(iterable [,r]):

創建一個迭代器,返回iterable中所有長度爲r的項目序列,如果省略了r,那麼序列的長度與iterable中的項目數量相同:

View Code
複製代碼
 1 def permutations(iterable, r=None):
 2 # permutations('ABCD', 2) --> AB AC AD BA BC BD CA CB CD DA DB DC
 3 # permutations(range(3)) --> 012 021 102 120 201 210
 4       pool = tuple(iterable)
 5       n = len(pool)
 6       r = n if r is None else r
 7 if r > n:
 8 return
 9       indices = range(n)
10      cycles = range(n, n-r, -1)
11 yield tuple(pool[i] for i in indices[:r])
12 while n:
13 for i in reversed(range(r)):
14              cycles[i] -=1
15 if cycles[i] == 0:
16                  indices[i:] = indices[i+1:] + indices[i:i+1]
17                  cycles[i] = n - i
18 else:
19                  j = cycles[i]
20                  indices[i], indices[-j] = indices[-j], indices[i]
21 yield tuple(pool[i] for i in indices[:r])
22 break
23 else:
24 return
複製代碼

 

product(iter1, iter2, ... iterN, [repeat=1]):

創建一個迭代器,生成表示item1,item2等中的項目的笛卡爾積的元組,repeat是一個關鍵字參數,指定重複生成序列的次數。

View Code
複製代碼
1 def product(*args, **kwds):
2 # product('ABCD', 'xy') --> Ax Ay Bx By Cx Cy Dx Dy
3 # product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111
4      pools = map(tuple, args) * kwds.get('repeat', 1)
5      result = [[]]
6 for pool in pools:
7          result = [x+[y] for x in result for y in pool]
8 for prod in result:
9 yield tuple(prod)
複製代碼

 

repeat(object [,times]):

創建一個迭代器,重複生成object,times(如果已提供)指定重複計數,如果未提供times,將無止盡返回該對象。

View Code
複製代碼
1 def repeat(object, times=None):
2 # repeat(10, 3) --> 10 10 10
3 if times is None:
4 while True:
5 yield object
6 else:
7 for i in xrange(times):
8 yield object
複製代碼

starmap(func [, iterable]):

創建一個迭代器,生成值func(*item),其中item來自iterable,只有當iterable生成的項適用於這種調用函數的方式時,此函數纔有效。

View Code
1 def starmap(function, iterable):
2 # starmap(pow, [(2,5), (3,2), (10,3)]) --> 32 9 1000
3 for args in iterable:
4 yield function(*args)

 

takewhile(predicate [, iterable]):

創建一個迭代器,生成iterable中predicate(item)爲True的項,只要predicate計算爲False,迭代就會立即停止。

View Code
複製代碼
1 def takewhile(predicate, iterable):
2 # takewhile(lambda x: x<5, [1,4,6,4,1]) --> 1 4
3 for x in iterable:
4 if predicate(x):
5 yield x
6 else:
7 break
複製代碼

 

tee(iterable [, n]):

從iterable創建n個獨立的迭代器,創建的迭代器以n元組的形式返回,n的默認值爲2,此函數適用於任何可迭代的對象,但是,爲了克隆原始迭代器,生成的項會被緩存,並在所有新創建的迭代器中使用,一定要注意,不要在調用tee()之後使用原始迭代器iterable,否則緩存機制可能無法正確工作。

View Code
複製代碼
def tee(iterable, n=2):
    it = iter(iterable)
    deques = [collections.deque() for i in range(n)]
    def gen(mydeque):
        while True:
            ifnot mydeque:             # when the local deque is empty
                newval = next(it)       # fetch a new value and
for d in deques:        # load it to all the deques
                    d.append(newval)
            yield mydeque.popleft()
    return tuple(gen(d) for d in deques)

#Once tee() has made a split, the original iterable should not be used anywhere else; otherwise, 
the iterable could get advanced without the tee objects being informed.
#This itertool may require significant auxiliary storage (depending on how much temporary data needs to be stored). 
In general, if one iterator uses most or all of the data before another iterator starts, it is faster to use list() instead of tee().

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章