標籤:
itertools模組為python2.6之後引入的,包含建立有效迭代器的函數,可以用各種方式對資料進行迴圈操作,
此模組中的所有函數返回的迭代器都可以與for迴圈語句以及其他包含迭代器(如產生器和產生器運算式)的函數聯合使用。
注意itertools模組中的函數所建立的都是對象,並且是可迭代對象。
1、itertools.count(start=0, step=1)
建立一個迭代器,產生從n開始的連續整數,如果忽略n,則從0開始計算(注意:此迭代器不支援長整數)
如果超出了sys.maxint,計數器將溢出並繼續從-sys.maxint-1開始計算
from itertools import *for i in izip(count(1), [‘a‘, ‘b‘, ‘c‘]): print i(1, ‘a‘)(2, ‘b‘)(3, ‘c‘)
2、itertools.cycle(iterable)
建立一個迭代器,對iterable中的元素反覆執行迴圈操作,內部會產生iterable中的元素的一個副本,此副本用於返回迴圈中的重複項。
from itertools import *i = 0for item in cycle([‘a‘, ‘b‘, ‘c‘]): i += 1 if i == 10: break print (i, item)(1, ‘a‘)(2, ‘b‘)(3, ‘c‘)(4, ‘a‘)(5, ‘b‘)(6, ‘c‘)(7, ‘a‘)(8, ‘b‘)(9, ‘c‘)
3、itertools.repeat(object[, times])
建立一個迭代器,重複產生object,times(如果已提供)指定重複計數,如果未提供times,將無止盡返回該對象。
from itertools import *for i in repeat(‘over-and-over‘, 5): print iover-and-overover-and-overover-and-overover-and-overover-and-over
4、itertools.imap(function, *iterables)
建立一個迭代器,產生項function(i1, i2, ..., iN),其中i1,i2...iN分別來自迭代器iter1,iter2 ... iterN,如果function為None,則返回(i1, i2, ..., iN)形式的元組,只要提供的一個迭代器不再產生值,迭代就會停止。
即:返回一個迭代器, 它是調用了一個其值在輸入迭代器上的函數, 返回結果. 它類似於內建函數 map() , 只是前者在任意輸入迭代器結束後就停止(而不是插入None值來補全所有的輸入).
返回序列每個元素被func執行後傳回值的序列的迭代器,很像map()函數。
from itertools import *print ‘Doubles:‘for i in imap(lambda x:2*x, xrange(5)): print iprint ‘Multiples:‘for i in imap(lambda x,y:(x, y, x*y), xrange(5), xrange(5,10)): print ‘%d * %d = %d‘ % iDoubles:02468Multiples:0 * 5 = 01 * 6 = 62 * 7 = 143 * 8 = 244 * 9 = 36
5、itertools.chain(*iterables)
將多個迭代器作為參數, 但只返回單個迭代器, 它產生所有參數迭代器的內容, 就好像他們是來自於一個單一的序列。
from itertools import *for i in chain([1, 2, 3], [‘a‘, ‘b‘, ‘c‘]): print i123abcfrom itertools import chain, imapdef flatmap(f, items): return chain.from_iterable(imap(f, items))>>> list(flatmap(os.listdir, dirs))>>> [‘settings.py‘, ‘wsgi.py‘, ‘templates‘, ‘app.py‘, ‘templates‘, ‘index.html, ‘config.json‘]
6、itertools.dropwhile(predicate, iterable)
建立一個迭代器,只要函數predicate(item)為True,就丟棄iterable中的項,如果predicate返回False,就會產生iterable中的項和所有後續項。
即:在條件為false之後的第一次, 返回迭代器中剩下來的項.
from itertools import *def should_drop(x): print ‘Testing:‘, x return (x<1)for i in dropwhile(should_drop, [ -1, 0, 1, 2, 3, 4, 1, -2 ]): print ‘Yielding:‘, iTesting: -1Testing: 0Testing: 1Yielding: 1Yielding: 2Yielding: 3Yielding: 4Yielding: 1Yielding: -2
7、itertools.groupby(iterable[, key])
返回一個產生按照key進行分組後的值集合的迭代器.
如果iterable在多次連續迭代中產生了同一項,則會定義一個組,如果將此函數應用一個分類列表,那麼分組將定義該列表中的所有唯一項,key(如果已提供)是一個函數,應用於每一項,如果此函數存在傳回值,該值將用於後續項而不是該項本身進行比較,此函數返回的迭代器產生元素(key, group),其中key是分組的索引值,group是迭代器,產生組成該組的所有項。
即:按照keyfunc函數對序列每個元素執行後的結果分組(每個分組是一個迭代器), 返回這些分組的迭代器。
from itertools import groupbyqs = [{‘date‘ : 1},{‘date‘ : 2}][(name, list(group)) for name, group in itertools.groupby(qs, lambda p:p[‘date‘])]Out[77]: [(1, [{‘date‘: 1}]), (2, [{‘date‘: 2}])]>>> from itertools import *>>> a = [‘aa‘, ‘ab‘, ‘abc‘, ‘bcd‘, ‘abcde‘]>>> for i, k in groupby(a, len):... print i, list(k)...2 [‘aa‘, ‘ab‘]3 [‘abc‘, ‘bcd‘]5 [‘abcde‘]
8、itertools.ifilter(predicate, iterable)
返回的是迭代器類似於針對列表的內建函數 filter() , 它只包括當測試函數返回true時的項. 它不同於 dropwhile()
建立一個迭代器,僅產生iterable中predicate(item)為True的項,如果predicate為None,將返回iterable中所有計算為True的項
對函數func執行返回真的元素的迭代器。
from itertools import *def check_item(x): print ‘Testing:‘, x return (x<1)for i in ifilter(check_item, [ -1, 0, 1, 2, 3, 4, 1, -2 ]): print ‘Yielding:‘, iTesting: -1Yielding: -1Testing: 0Yielding: 0Testing: 1Testing: 2Testing: 3Testing: 4Testing: 1Testing: -2Yielding: -2
9、itertools.ifilterfalse(predicate, iterable)
和ifilter(函數相反 , 返回一個包含那些測試函數返回false的項的迭代器)
建立一個迭代器,僅產生iterable中predicate(item)為False的項,如果predicate為None,則返回iterable中所有計算為False的項 對函數func執行返回假的元素的迭代器。
from itertools import *def check_item(x): print ‘Testing:‘, x return (x<1)for i in ifilterfalse(check_item, [ -1, 0, 1, 2, 3, 4, 1, -2 ]): print ‘Yielding:‘, iTesting: -1Testing: 0Testing: 1Yielding: 1Testing: 2Yielding: 2Testing: 3Yielding: 3Testing: 4Yielding: 4Testing: 1Yielding: 1Testing: -2
10、itertools.islice(iterable, stop)
itertools.islice(iterable, start, stop[, step])
返回的迭代器是返回了輸入迭代器根據索引來選取的項
建立一個迭代器,產生項的方式類似於切片傳回值: iterable[start : stop : step],將跳過前start個項,迭代在stop所指定的位置停止,step指定用於跳過項的步幅。 與切片不同,負值不會用於任何start,stop和step, 如果省略了start,迭代將從0開始,如果省略了step,步幅將採用1.
返回序列seq的從start開始到stop結束的步長為step的元素的迭代器。
from itertools import *print ‘Stop at 5:‘for i in islice(count(), 5): print iprint ‘Start at 5, Stop at 10:‘for i in islice(count(), 5, 10): print iprint ‘By tens to 100:‘for i in islice(count(), 0, 100, 10): print iStop at 5:01234Start at 5, Stop at 10:56789By tens to 100:0102030405060708090
11、itertools.starmap(function, iterable)
建立一個迭代器,產生值func(*item),其中item來自iterable,只有當iterable產生的項適用於這種調用函數的方式時,此函數才有效。
對序列seq的每個元素作為func的參數列表執行, 返回執行結果的迭代器。
from itertools import *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‘ % i0 * 5 = 01 * 6 = 62 * 7 = 143 * 8 = 244 * 9 = 36
12、itertools.tee(iterable[, n=2])
返回一些基於單個原始輸入的獨立迭代器(預設為2). 它和Unix上的tee工具有點語義相似, 也就是說它們都重複讀取輸入裝置中的值並將值寫入到一個命名檔案和標準輸出中
從iterable建立n個獨立的迭代器,建立的迭代器以n元組的形式返回,n的預設值為2,此函數適用於任何可迭代的對象,但是,為了複製原始迭代器,產生的項會被緩衝,並在所有新建立的迭代器中使用,一定要注意,不要在調用tee()之後使用原始迭代器iterable,否則緩衝機制可能無法正確工作。
把一個迭代器分為n個迭代器, 返回一個元組.預設是兩個
from itertools import *r = islice(count(), 5)i1, i2 = tee(r)for i in i1: print ‘i1:‘, ifor i in i2: print ‘i2:‘, ii1: 0i1: 1i1: 2i1: 3i1: 4i2: 0i2: 1i2: 2i2: 3i2: 4
13、itertools.takewhile(predicate, iterable)
和dropwhile相反
建立一個迭代器,產生iterable中predicate(item)為True的項,只要predicate計算為False,迭代就會立即停止。
即:從序列的頭開始, 直到執行函數func失敗。
from itertools import *def should_take(x): print ‘Testing:‘, x return (x<2)for i in takewhile(should_take, [ -1, 0, 1, 2, 3, 4, 1, -2 ]): print ‘Yielding:‘, iTesting: -1Yielding: -1Testing: 0Yielding: 0Testing: 1Yielding: 1Testing: 2
14、itertools.izip(*iterables)
返回一個合并了多個迭代器為一個元組的迭代器. 它類似於內建函數zip(), 只是它返回的是一個迭代器而不是一個列表
建立一個迭代器,產生元組(i1, i2, ... iN),其中i1,i2 ... iN 分別來自迭代器iter1,iter2 ... iterN,只要提供的某個迭代器不再產生值,迭代就會停止,此函數產生的值與內建的zip()函數相同。
from itertools import *for i in izip([1, 2, 3], [‘a‘, ‘b‘, ‘c‘]): print i(1, ‘a‘)(2, ‘b‘)(3, ‘c‘)
15、itertools.izip_longest(*iterables[, fillvalue])
與izip()相同,但是迭代過程會持續到所有輸入迭代變數iter1,iter2等都耗盡為止,如果沒有使用fillvalue關鍵字參數指定不同的值,則使用None來填充已經使用的迭代變數的值。
class ZipExhausted(Exception): passdef izip_longest(*args, **kwds): # izip_longest(‘ABCD‘, ‘xy‘, fillvalue=‘-‘) --> Ax By C- D- fillvalue = kwds.get(‘fillvalue‘) counter = [len(args) - 1] def sentinel(): if not counter[0]: raise ZipExhausted counter[0] -= 1 yield fillvalue fillers = repeat(fillvalue) iterators = [chain(it, sentinel(), fillers) for it in args] try: while iterators: yield tuple(map(next, iterators)) except ZipExhausted: pass
更多請參考http://wklken.me/posts/2013/08/20/python-extra-itertools.html (這裡偷懶粘貼複製了)
Python常用模組之三 itertools