【Python基础】Python中的高效迭代库itertools,排列组合随便求
本文目錄
一、模塊概述
二、組合生成器
2.1 product
2.2 permutations
2.3 combinations
2.4 combinations_with_replacement
三、無限迭代器
3.1 count
3.2 cycle
3.3 repeat
四、有限迭代器
4.1 accumulate
4.2 chain
4.3 chain.from_iterable
4.4 compress
4.5 dropwhile
4.6 filterfalse
4.7 groupby
4.8 islice
4.9 starmap
4.10 takewhile
4.11 tee
4.12 zip_longest
五、總結(jié)
?
?
一、模塊概述
Functional tools for creating and using iterators,為高效循環(huán)而創(chuàng)建迭代器的函數(shù)。本模塊標(biāo)準(zhǔn)化了一個(gè)快速、高效利用內(nèi)存的核心工具集,這些工具本身或組合都很有用。它們一起形成了“迭代器代數(shù)”,這使得在純Python中有可能創(chuàng)建簡潔又高效的專用工具。
permutations函數(shù)可以求序列的排列,combinations函數(shù)可以求序列的組合,除了這兩個(gè)函數(shù)外,itertools還有相當(dāng)多的功能,它主要是提供迭代類的操作。
迭代器的特點(diǎn)是:惰性求值(Lazy evaluation),即只有當(dāng)?shù)聊硞€(gè)值時(shí),它才會被計(jì)算,這個(gè)特點(diǎn)使得迭代器特別適合于遍歷大文件或無限集合等,因?yàn)槲覀儾挥靡淮涡詫⑺鼈兇鎯υ趦?nèi)存中。itertools 模塊提供的迭代器函數(shù)有以下幾種類型:
組合生成器:序列的排列、組合,求序列的笛卡兒積等,比如product可以生成兩個(gè)序列的笛卡爾積;
無限迭代器:生成一個(gè)無限序列,比如count函數(shù)能生成自然數(shù)序列 1, 2, 3, 4, ...
有限迭代器:接收一個(gè)或多個(gè)序列(sequence)作為參數(shù),進(jìn)行組合、分組和過濾等,比如chain函數(shù),能組合多個(gè)序列
print(dir(itertools)) ['__doc__', '__loader__', '__name__', '__package__', '__spec__','_grouper', '_tee', '_tee_dataobject', 'accumulate', 'chain', 'combinations', 'combinations_with_replacement', 'compress', 'count', 'cycle', 'dropwhile', 'filterfalse', 'groupby', 'islice', 'permutations', 'product', 'repeat', 'starmap', 'takewhile', 'tee', 'zip_longest']總之該模塊為Python為創(chuàng)建自定義迭代器提供了非常好用的模塊——itertools。由itertools提供的工具通常都很快速而且節(jié)省內(nèi)存。你可以利用這些組成部分去創(chuàng)建自己獨(dú)有的迭代器以完成高效的循環(huán)
官方參考文檔:https://docs.python.org/zh-cn/3/library/itertools.html
?
二、排列組合迭代器
迭代器 | 實(shí)參 | 結(jié)果 |
product() | p, q, ... [repeat=1] | 笛卡爾積,相當(dāng)于嵌套的for循環(huán) |
permutations() | p[, r] | 長度r元組,所有可能的排列,無重復(fù)元素 |
combinations() | p, r | 長度r元組,有序,無重復(fù)元素 |
combinations_with_replacement() | p, r | 長度r元組,有序,元素可重復(fù) |
?
例子 | 結(jié)果 |
product('ABCD',?repeat=2) | AA?AB?AC?AD?BA?BB?BC?BD?CA?CB?CC?CD?DA?DB?DC?DD |
permutations('ABCD',?2) | AB?AC?AD?BA?BC?BD?CA?CB?CD?DA?DB?DC |
combinations('ABCD',?2) | AB?AC?AD?BC?BD?CD |
combinations_with_replacement('ABCD',?2) | AA?AB?AC?AD?BB?BC?BD?CC?CD?DD |
2.1 product
作用:用于求多個(gè)可迭代對象的笛卡爾積,它跟嵌套的 for 循環(huán)等價(jià)
語法:itertools.product(iter1, iter2, ... iterN, [repeat=1])
for each in itertools.product('ABCD', 'XY'):print(each) ('A', 'X') ('A', 'Y') ('B', 'X') ('B', 'Y') ('C', 'X') ('C', 'Y') ('D', 'X') ('D', 'Y')for each in itertools.product('abc', repeat=2):print (each) ('a', 'a') ('a', 'b') ('a', 'c') ('b', 'a') ('b', 'b') ('b', 'c') ('c', 'a') ('c', 'b') ('c', 'c')
2.2 permutations
作用:返回長度為r的排列
語法:itertools.permutations(iteravle[,r])
iterable: 可迭代對象
r: 關(guān)鍵字參數(shù), 新元素的長度, 默認(rèn)為 None, 即為新元素的長度就是元素個(gè)數(shù)
將 iterable 中的元素以長度為 r 進(jìn)行排列。每個(gè)排列組合生成一個(gè)元組并添加到新迭代器中。排列時(shí),排列順序是按照 iterable 中元素的順序進(jìn)行的。因此,未排序的 iterable 和已排序的 iterable 排列后的結(jié)果是不同的。
若 iterable 中有相同值的元素,但是它們的位置是不同的,排列時(shí)也就會會認(rèn)為它們是不同的。注意: 排列即為數(shù)學(xué)上的排列,從 n 個(gè)元素中取出 m 個(gè)元素的無重復(fù)排列或直線排列。
for each in itertools.permutations('abc', 2):print (each) ('a', 'b') ('a', 'c') ('b', 'a') ('b', 'c') ('c', 'a') ('c', 'b')
2.3 combinations
作用:返回指定長度的組合
語法: itertools.combinations(iterable, r)
iterable: 可迭代對象 r: 新元素的長度 for each in itertools.combinations('abc', 2):print (each) ('a', 'b') ('a', 'c') ('b', 'c') 將 iterable 中的元素以長度為 r 進(jìn)行組合。每個(gè)排列組合生成一個(gè)元組并添加到新迭代器中。與 permutations() 函數(shù)基本一致,但是 combinations() 函數(shù)會過濾掉元素值一致的元組。 '''相比于排列,組合會篩選掉元素值一樣的元組''' list(itertools.combinations('ABC', 2)) [('A', 'B'), ('A', 'C'), ('B', 'C')]'''排列對照組''' list(itertools.permutations('ABC', 2)) [('A', 'B'), ('A', 'C'), ('B', 'A'), ('B', 'C'), ('C', 'A'), ('C', 'B')]
2.4 combinations_with_replacement
作用:返回指定長度的組合,組合內(nèi)元素可重復(fù)
語法:itertools.combinations_with_replacement(iterable, r)
iterable: 可迭代對象
r: 關(guān)鍵字參數(shù), 新元素的長度, 默認(rèn)為 None, 即為新元素的長度就是元素個(gè)數(shù)
三、無限迭代器
有三個(gè)無限迭代器,當(dāng)你使用它們的時(shí)候,你要知道何時(shí)去跳出這個(gè)循環(huán),不然你將陷入無限循環(huán)之中,在生產(chǎn)數(shù)字或者遍歷事先不知道長度的數(shù)據(jù)時(shí)非常有用。
迭代器 | 實(shí)參 | 結(jié)果 | 示例 |
count() | start, [step] | start,start+step,start+2*step, ... | count(10)?-->?10?11?12?13?14?... |
cycle() | p | p0, p1, ... plast, p0, p1, ... | cycle('ABCD')?-->?A?B?C?D?A?B?C?D?... |
repeat() | elem [,n] | elem, elem, elem, ... 重復(fù)無限次或n次 | repeat(10,?3)?-->?10?10?10 |
3.1 count()
作用:返回以start開始,step遞增的序列,無限遞增
語法:itertools.count(start=0,step=1)
for each in itertools.count(start=0, step=2):print (each) 1 2 ... 100003'''小應(yīng)用, 當(dāng)取到第三個(gè) A 時(shí)停止''' test_str = '' for i in itertools.cycle('ABC'):test_str += iif test_str.count('A') >= 3:break print(test_str) # ABCABCA3.2 cycle()
作用:將迭代器進(jìn)行無限迭代
語法:itertools.cycle(iterable)
for each in itertools.cycle('ab'):print(each) a b ... b a3.3 repeat()
作用:不停的返回object對象,如果指定了times,則返回times次
語法:itertools.repeat(object,[,times])
for each in itertools.repeat('ab', 2): print(each) ab ab?
四、有限迭代器
迭代器 | 實(shí)參 | 結(jié)果 | 示例 |
accumulate() | p [,func] | p0, p0+p1, p0+p1+p2, ... | accumulate([1,2,3,4,5])?-->?1?3?6?10?15 |
chain() | p, q, ... | p0, p1, ... plast, q0, q1, ... | chain('ABC',?'DEF')?-->?A?B?C?D?E?F |
chain.from_iterable() | iterable | p0, p1, ... plast, q0, q1, ... | chain.from_iterable(['ABC',?'DEF'])?-->?A?B?C?D?E?F |
compress() | data, selectors | (d[0] if s[0]), (d[1] if s[1]), ... | compress('ABCDEF',?[1,0,1,0,1,1])?-->?A?C?E?F |
dropwhile() | pred, seq | seq[n], seq[n+1], ... 從pred首次真值測試失敗開始 | dropwhile(lambda?x:?x<5,?[1,4,6,4,1])?-->?6?4?1 |
filterfalse() | pred, seq | seq中pred(x)為假值的元素,x是seq中的元素。 | filterfalse(lambda?x:?x%2,?range(10))?-->?0?2?4?6?8 |
groupby() | iterable[, key] | 根據(jù)key(v)值分組的迭代器 | |
islice() | seq, [start,] stop [, step] | seq[start:stop:step]中的元素 | islice('ABCDEFG',?2,?None)?-->?C?D?E?F?G |
starmap() | func, seq | func(*seq[0]), func(*seq[1]), ... | starmap(pow,?[(2,5),?(3,2),?(10,3)])?-->?32?9?1000 |
takewhile() | pred, seq | seq[0], seq[1], ..., 直到pred真值測試失敗 | takewhile(lambda?x:?x<5,?[1,4,6,4,1])?-->?1?4 |
tee() | it, n | it1, it2, ... itn 將一個(gè)迭代器拆分為n個(gè)迭代器 | |
zip_longest() | p, q, ... | (p[0], q[0]), (p[1], q[1]), ... | zip_longest('ABCD',?'xy',?fillvalue='-')?-->?Ax?By?C-?D- |
4.1 accumulate()
作用:創(chuàng)建一個(gè)迭代器,返回累積匯總值或其他雙目運(yùn)算函數(shù)的累積結(jié)果值(通過可選的 func 參數(shù)指定),,若傳入 func,則按照 func 中的方法執(zhí)行。
語法:itertools.accumulate(iterable[, func, *, initial=None])
iterable: 可迭代對象
func: 帶有兩個(gè)參數(shù)的函數(shù), 可選參數(shù),func 參數(shù)有幾種用法。它可以被設(shè)為 min()?最終得到一個(gè)最小值,或者設(shè)為 max()?最終得到一個(gè)最大值,或設(shè)為 operator.mul()?最終得到一個(gè)乘積。攤銷表可通過累加利息和支付款項(xiàng)得到。給iterable設(shè)置初始值并只將參數(shù) func 設(shè)為累加總數(shù)可以對一階?遞歸關(guān)系?建模。
initial: 關(guān)鍵字參數(shù), 默認(rèn)為 None, 若此參數(shù)傳參, 則此參數(shù)作為 iterable 的第一個(gè)元素
4.2 chain()
作用:chain?接收多個(gè)可迭代對象作為參數(shù),將它們『連接』起來,作為一個(gè)新的迭代器返回。
語法:chain(iterable1,?iterable2,?iterable3,?...)
list(itertools.chain([1, 2, 3], ('A', 'B', 'C'), {'一', '二', '三'})) [1,?2,?3,?'A',?'B',?'C',?'二',?'一',?'三'] list(itertools.chain( 'ABC', 'DEF')) ['A', 'B', 'C', 'D', 'E', 'F']
4.3?chain.from_iterable
作用:與 itertools.chain()?函數(shù)類似,但是參數(shù)是一個(gè)可迭代對象,將這個(gè)可迭代對象中元素一一添加到新迭代器中,如果元素是一個(gè)可迭代對象,那么會將這個(gè)元素內(nèi)的元素一一添加到新迭代器中。小編自己的理解就是迭代器降維。
語法:itertools.chain.from_iterable(iterable)
'''將二維迭代器降維''' temp = itertools.chain.from_iterable(['1', ['2', '3'], ('4', '5')]) print(list(temp)) # ['1', '2', '3', '4', '5']'''只能降一層維度, 三維將至二維''' temp = itertools.chain.from_iterable(['1', ['2', '3'], ('4', ['5', '6'])]) print(list(temp)) # ['1', '2', '3', '4', ['5', '6']]PS:?迭代器維度概念可以理解為,整個(gè)迭代器中的元素都不是迭代器類型的就是一維,迭代器中的元素有是迭代器的就是二維,迭代器中的元素有是迭代器的,然后這個(gè)迭代器中還有元素是迭代器的就是三維,依此類推。
4.4 compress
作用:創(chuàng)建一個(gè)迭代器,將 data 中經(jīng)過 selectors 真值測試為 True 的元素保留。當(dāng)兩個(gè)可迭代對象中的某一個(gè)到達(dá)末尾時(shí)執(zhí)行停止,返回最終結(jié)果。
語法:compress(data,?selectors)
data: 可迭代對象, 包含所需的數(shù)據(jù)
selectors: 可迭代對象, 真值測試數(shù)據(jù)
4.5 dropwhile
作用:直到predicate為真,就返回iterable剩下的數(shù)據(jù), 否則drop掉
語法:itertools.dropwhile(predicate, iterable)
for each in itertools.dropwhile(lambda x: x<5, [2,1,6,8,2,1]):print(each) 6 8 2 14.6 filterfalse
作用:創(chuàng)建一個(gè)迭代器,僅保留 iterable 中在 predicate 計(jì)算中為 False 的元素。如果 predicate 傳入的是 None,則相當(dāng)于傳入 bool,意思是做真值測試。
語法:itertools.filterfalse(predicate, iterable)
predicate: 只需要一個(gè)參數(shù)的函數(shù)
iterable: 可迭代對象
'''元素的值減2小于等于0的為True''' temp = itertools.filterfalse(lambda x: x - 2 <= 0, [1, 2, 0, 3, 1]) print(list(temp)) #?[3] '''真值測試''' temp = itertools.filterfalse(None, [1, 2, 0, 3, 1]) print(list(temp)) # [0]
4.7 groupby
作用:返回一組(key,itera),key為iterable的值,itera為等于key的所有項(xiàng)
語法:itertools.groupby(iterable[,key])
for key, vale in itertools.groupby('aabbbc'):print( key, list(vale)) a ['a', 'a'] b ['b', 'b', 'b'] c ['c']4.8 islice
作用:相當(dāng)于迭代器方式的切片操作
語法:itertools.islice(iterable, start,stop[,step])
for each in itertools.islice('abcdefg', 1, 4, 2):print(each) b d4.9 starmap()
作用:返回function(iter)的值,iter為iterable的元素
語法:itertools.starmap(function,iterable)
for each in itertools.starmap(lambda x, y: x * y, [(1, 2), (3, 4)]):print(each) 2 124.10?takewhile()
作用:創(chuàng)建一個(gè)迭代器,將 iterable 中的元素當(dāng)作 function 的參數(shù)計(jì)算,與 dropwhile()?函數(shù)恰恰相反,當(dāng)結(jié)果的布爾值為 True 時(shí),其元素添加到新迭代器中, 直到有元素的計(jì)算結(jié)果為 False 時(shí),此元素與之后的元素全部拋棄。
語法:itertools.takewhile(predicate,iterable)
for each in itertools.takewhile(lambda x: x < 5, [1, 3, 5, 6]): print(each) 1 3
4.11 tee
作用:從一個(gè)可迭代對象中分裂出 n 個(gè)獨(dú)立的可迭代對象并返回。
語法:itertools.tee(iterable, n=2)
for i in itertools.tee([1, 2, 3, 4, 5, 6], 2):print(list(i)) # [1, 2, 3, 4, 5, 6] # [1, 2, 3, 4, 5, 6]4.12 zip_longest
作用:創(chuàng)建一個(gè)迭代器,從所有傳入的可迭代對象中抽取一個(gè)元素,將它們組合成一個(gè)元組,然后添加到迭代器中。
語法:itertools.zip_longest(*iterables, fillvalue=None)
iterables: 一個(gè)或多個(gè)可迭代對象
fillvalue: 關(guān)鍵字參數(shù), 填充值, 默認(rèn)為 None
五、總 ? 結(jié)
迭代器(生成器)在Python中是一種很常用也很好用的數(shù)據(jù)結(jié)構(gòu),比起列表(list)來說,迭代器最大的優(yōu)勢就是延遲計(jì)算,按需使用,從而提高開發(fā)體驗(yàn)和運(yùn)行效率,以至于在Python 3中map,filter等操作返回的不再是列表而是迭代器。而通過iter函數(shù)把列表對象轉(zhuǎn)化為迭代器對象又有點(diǎn)多此一舉,這時(shí)候我們今天的主角itertools就該上場了。
?
itertools中的函數(shù)大多是返回各種迭代器對象,其中很多函數(shù)的作用我們平時(shí)要寫很多代碼才能達(dá)到,而在運(yùn)行效率上反而更低,大概就總結(jié)到這里,不過Python的各種語言特性和庫還是要多用才能熟練,最終達(dá)到隨手拈來的程度。
往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載機(jī)器學(xué)習(xí)及深度學(xué)習(xí)筆記等資料打印機(jī)器學(xué)習(xí)在線手冊深度學(xué)習(xí)筆記專輯《統(tǒng)計(jì)學(xué)習(xí)方法》的代碼復(fù)現(xiàn)專輯 AI基礎(chǔ)下載機(jī)器學(xué)習(xí)的數(shù)學(xué)基礎(chǔ)專輯 本站qq群704220115,加入微信群請掃碼:總結(jié)
以上是生活随笔為你收集整理的【Python基础】Python中的高效迭代库itertools,排列组合随便求的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tim怎么设置检测到新版本自动安装 ti
- 下一篇: 【Python基础】Python的元组,