一、介紹
itertools 是python的迭代器模塊,itertools提供的生成迭代器的函數,相當高效且節省內存。使用這些工具,你將能夠創建自己定制的迭代器用於高效率的循環。
二、速查表
無限迭代器:
迭代器 |
參數 |
結果 |
例子 |
---|---|---|---|
start, [step] |
start, start+step, start+2*step, … |
|
|
p |
p0, p1, … plast, p0, p1, … |
|
|
elem [,n] |
elem, elem, elem, … endlessly or up to n times |
|
有限序列迭代器:
迭代器 |
參數 |
結果 |
例子 |
---|---|---|---|
p [,func] |
p0, p0+p1, p0+p1+p2, … |
|
|
p, q, … |
p0, p1, … plast, q0, q1, … |
|
|
iterable |
p0, p1, … plast, q0, q1, … |
|
|
data, selectors |
(d[0] if s[0]), (d[1] if s[1]), … |
|
|
pred, seq |
seq[n], seq[n+1], starting when pred fails |
|
|
pred, seq |
elements of seq where pred(elem) is false |
|
|
iterable[, key] |
sub-iterators grouped by value of key(v) |
||
seq, [start,] stop [, step] |
elements from seq[start:stop:step] |
|
|
func, seq |
func(*seq[0]), func(*seq[1]), … |
|
|
pred, seq |
seq[0], seq[1], until pred fails |
|
|
it, n |
it1, it2, … itn splits one iterator into n |
||
p, q, … |
(p[0], q[0]), (p[1], q[1]), … |
|
排列組合迭代器:
Iterator |
Arguments |
Results |
---|---|---|
p, q, … [repeat=1] |
cartesian product, equivalent to a nested for-loop |
|
p[, r] |
r-length tuples, all possible orderings, no repeated elements |
|
p, r |
r-length tuples, in sorted order, no repeated elements |
|
p, r |
r-length tuples, in sorted order, with repeated elements |
|
|
|
|
|
|
|
|
|
|
|
|
三、模塊函數詳細說明與使用
1、計數、幾步
itertools.count(start=0, step=1)
- start:計數起始值。
- step:計數間隔。
說明:生成一個迭代器,該迭代器從start開始迭代,第i次迭代返回start+i*step。
代碼示例:
import itertools #輸出0-9的奇數 for i in itertools.count(1,2): print(i) if i==9 : break ''' 結果: 1 3 5 7 9 '''
2、無限循環(往復)迭代
itertools.cycle(iterable)
- iterable:可迭代對象。
說明: 把iterable變成無限循環迭代的迭代器,讓iter不再只能迭代一輪。
代碼示例:
import itertools j=0 #循環輸出'abc'中的字母 for i in itertools.cycle('abc'): print(i) #第5步結束循環 j+=1 if j==5 : break ''' 結果: a b c a b '''
3、重復
itertools.repeat(object,times=None)
- object:一個對象用於重復。
- times:重復次數。
說明: 生成一個重復times次object的迭代器,若times=None則無限次重復。
代碼示例:
import itertools for i in itertools.repeat('練習',3): print(i) ''' 結果: 練習 練習 練習 '''
4、迭代器拼接
itertools.chain(*iterables)
- *iterables:可以傳入多個迭代器作為參數。
說明: 把傳入的多個iterable拼接成一個迭代器,並且按傳入順序迭代。
itertools.chain.from_iterable(iterable)
- iterable:可迭代對象。
說明: 將iterable的元素進行拼接后生成迭代器,按iterable元素迭代順序進行拼接,iterable的元素必須是可迭代的,例如含有可迭代對象的列表['abc',[1,2,3]]。
代碼示例:
import itertools print('單獨的迭代器拼接') for i in itertools.chain('abc',[1,2,3]): print(i) print('用iterable的元素拼接,iterable的元素必須為可迭代:') for i in itertools.chain.from_iterable(['abc',[1,2,3]]): print(i) ''' 結果: 單獨的迭代器拼接 a b c 1 2 3 用該列表的元素拼接,列表元素必須為可迭代器: a b c 1 2 3 '''
5、數據選擇、篩選
itertools.compress(data,selector)
- data:一個可以用來迭代的數據。
- selector:選擇器,用來對data進行篩選。
說明: 生成一個篩選之后的迭代器,篩選規則為,當selector的第i個值為真,則保留data的第i個值,否則去除data的第i個值,類似於numpy.where(),但是不要求selector於data有相同的迭代長度。
代碼示例:
import itertools #data長度為5,selector長度為3 for i in itertools.compress([1,2,3,4,5,6],[1,0,1]): print(i) ''' 結果: 1 3 '''
6、數據剔除
dropwhile(predicate, iterable)
- predicate:一個判斷函數,該函數返回值類型為bool。
- iterable:可迭代對象。
說明:將iterable中的元素傳入predicate中作為predicate的參數,若predicate返回True則去除,若predicate返回Flase則保留,最后生成一個迭代器。
代碼示例:
import itertools #去除小於3的數 for i in itertools.dropwhile(lambda x:x<3,[1,2,3,4,5]): print(i) ''' 結果: 3 4 5 '''
7、相鄰數據分組
groupby(iterable, key=None)
- iterable:可迭代對象。
- key:一個函數,將iterable的元素傳入作為參數。
說明:把迭代器中相鄰的重復元素挑出來放在一起,挑選規則是通過key函數完成的,只要作用於函數的兩個元素返回的值相等,這兩個元素就被認為是在一組的,而函數返回值作為組的key。如果我們要忽略大小寫分組,就可以讓元素'A'
和'a'
都返回相同的key。groupby是一個迭代器類,每次迭代有兩個返回值,一個是key函數的返回值,一個是臨近的同組元素的迭代器。
代碼示例:
import itertools #將字符串元素轉換為大寫后,相鄰字符相同的組成一組 for i,j in itertools.groupby('AaBbA',lambda x:x.upper()): #i是lambda匿名函數返回的結果,j是函數處理之后的同組元素迭代器 print('%s:%s'%(i,list(j))) ''' 結果: A:['A', 'a'] B:['B', 'b'] A:['A'] '''
8、數據過濾
filterflase(predicate, iterable)
- predicate:斷言,一個判斷函數,該函數返回值類型為bool。
- iterable:可迭代對象。
說明:將iterable的元素不滿足predicate的元素去除過濾之后生成一個迭代器。
代碼示例:
import itertools #生成迭代器,其元素不包含原序列小於3的數據 for i in itertools.filterfalse(lambda x:x<3,[1,2,3,4,5]): print(i) ''' 結果: 3 4 5 '''
9、數據切片
islice(iterable, start, stop[, step])
- iterable:可迭代對象。
- start:起始索引。
- stop:結束索引。
- step:間隔。
說明:對iterable進行切片,參考函數slice。
代碼示例:
import itertools #生成迭代器,其元素不包含原序列小於3的數據 for i in itertools.islice([0,1,2,3,4,5],2,4,2): print(i) ''' 結果: 3 4 5 '''
10、數據映射
startmap(func,iterable)
- func:函數,用來對iterable的每個元素進行操作。
- iterable:可迭代對象。
說明:對iterable進行映射操作,參考map函數。兩者區別在於func有多個參數時,startmap為func(*arg)用的是可變參數,map為func(arg1,arg2)用的是位置參數
代碼示例:
import itertools #生成迭代器,其元素為原來元素之和的映射 for i in itertools.starmap(lambda x,y:x+y,[(1,1),(2,2),(3,3)]): print(i) ''' 結果: 2 4 6 '''
11、迭代器復制
tee(iterable,n=2)
- iterable:可迭代對象。
- n:要復制的個數。
說明:對iterable進行復制,生成n的相同的iterable。
代碼示例:
import itertools #復制迭代器 i,j,k=itertools.tee(iter('abc'),3) print(list(i)) print(list(j)) print(list(k)) ''' 結果: ['a', 'b', 'c'] ['a', 'b', 'c'] ['a', 'b', 'c'] '''
12、數據選取
takewhile(predicate, iterable)
- predicate:要復制的個數。
- iterable:可迭代對象。
說明:將iterable中的元素提取出來生,直到不滿足predicate就結束,類似於while循環。
代碼示例:
import itertools #復制迭代器 for i in itertools.takewhile(lambda x:x<3,[1,2,3,4,3,2,1]): print(i) ''' 結果: 1 2 '''
13、數據連接
izip_longest(*iterables, fillvalue=None)
- *iterables:需要連接的可迭代器。
- fillvalue:當連接的內容為空時的填充值,如:x=[1,2],y=[1],fillvalue=‘-’,list(izip_longest(x,y,'-'))則返回結果為[(1,1),(2,-)]。
說明:將多個iterable的元素按順序用元組的形式連接,類似zip。
代碼示例:
import itertools #復制迭代器 for i,j in itertools.zip_longest('abc','12',fillvalue='nan'): print(i,j) ''' 結果: a 1 b 2 c nan '''
13、數據笛卡爾積
product(*iterables,repeat)
- *iterables:需要笛卡爾積運算的可迭代器。
- repeat:將所有iterable重復repeat個之后再進行笛卡爾積,默認不重復。
說明:將多個iterable的元素進行笛卡爾積。
代碼示例:
import itertools print('不重復:') for i in itertools.product('ab','12'): print(i) print('重復2次:') for i in itertools.product('ab',repeat=2): print(i) ''' 結果: 不重復: ('a', '1') ('a', '2') ('b', '1') ('b', '2') 重復2次: ('a', 'a') ('a', 'b') ('b', 'a') ('b', 'b') '''
14、元素的組合
itertools.combinations(iterable, r)
- iterable:一個可迭代對象。
- r:取tierable對象中r個元素進行組合。
說明:生成一個迭代器,該迭代器將tierable的r個元素進行所有可能的組合,每次迭代只返回一個組合,迭代器可以用list()轉換成列表。
代碼示例:
import itertools
x=[1,2,3] combin_1=itertools.combinations(x,1) #取1個數進行組合,生成的時一個迭代器 combin_2=itertools.combinations(x,2) #取2個數進行組合,生成的是一個迭代器 print('combin_1:',list(combin_1)) #將迭代器轉為列表並打印 print('\ncombin_1、combin_2的數據類型:',type(combin_1)) print('\n輸出迭代器每次迭代內容:') for i in combin_2: print(i) ''' 結果: combin_1: [(1,), (2,), (3,)] combin_1、combin_2的數據類型: <class 'itertools.combinations'> 輸出迭代器每次迭代內容: (1, 2) (1, 3) (2, 3) '''
15、數據的排列
itertools.combinations(iterable, r)
- iterable:一個可迭代對象。
- r:取tierable對象中r個元素進行組合。
說明:生成一個迭代器,該迭代器將tierable的r個元素進行所有可能的排列,每次迭代只返回一個排列。
代碼示例:
import itertools
x=[1,2,3] combin_1=itertools.permutations(x,1) #取1個數進行組合,生成的時一個迭代器 combin_2=itertools.permutations(x,2) #取2個數進行組合,生成的是一個迭代器 print('combin_1:',list(combin_1)) #將迭代器轉為列表並打印 print('\ncombin_1、combin_2的數據類型:',type(combin_1)) print('\n輸出迭代器每次迭代內容:') for i in combin_2: print(i) ''' 結果: combin_1: [(1,), (2,), (3,)] combin_1、combin_2的數據類型: <class 'itertools.permutations'> 輸出迭代器每次迭代內容: (1, 2) (1, 3) (2, 1) (2, 3) (3, 1) (3, 2) '''