高效的 itertools 模組

發表於2017-02-16

我們知道,迭代器的特點是:惰性求值(Lazy evaluation),即只有當迭代至某個值時,它才會被計算,這個特點使得迭代器特別適合於遍歷大檔案或無限集合等,因為我們不用一次性將它們儲存在記憶體中。

Python 內建的 itertools 模組包含了一系列用來產生不同型別迭代器的函式或類,這些函式的返回都是一個迭代器,我們可以通過 for 迴圈來遍歷取值,也可以使用 next() 來取值。

itertools 模組提供的迭代器函式有以下幾種型別:

  • 無限迭代器:生成一個無限序列,比如自然數序列 1, 2, 3, 4, ...
  • 有限迭代器:接收一個或多個序列(sequence)作為引數,進行組合、分組和過濾等;
  • 組合生成器:序列的排列、組合,求序列的笛卡兒積等;

無限迭代器

itertools 模組提供了三個函式(事實上,它們是類)用於生成一個無限序列迭代器:

  • count(firstval=0, step=1)建立一個從 firstval (預設值為 0) 開始,以 step (預設值為 1) 為步長的的無限整數迭代器
  • cycle(iterable)對 iterable 中的元素反覆執行迴圈,返回迭代器
  • repeat(object [,times]反覆生成 object,如果給定 times,則重複次數為 times,否則為無限

下面,讓我們看看一些例子。

count

count() 接收兩個引數,第一個引數指定開始值,預設為 0,第二個引數指定步長,預設為 1:

cycle

cycle() 用於對 iterable 中的元素反覆執行迴圈:

repeat

repeat() 用於反覆生成一個 object:

有限迭代器

itertools 模組提供了多個函式(類),接收一個或多個迭代物件作為引數,對它們進行組合、分組和過濾等:

  • chain()
  • compress()
  • dropwhile()
  • groupby()
  • ifilter()
  • ifilterfalse()
  • islice()
  • imap()
  • starmap()
  • tee()
  • takewhile()
  • izip()
  • izip_longest()

chain

chain 的使用形式如下:

chain 接收多個可迭代物件作為引數,將它們『連線』起來,作為一個新的迭代器返回。

chain 還有一個常見的用法:

接收一個可迭代物件作為引數,返回一個迭代器:

compress

compress 的使用形式如下:

compress 可用於對資料進行篩選,當 selectors 的某個元素為 true 時,則保留 data 對應位置的元素,否則去除:

dropwhile

dropwhile 的使用形式如下:

其中,predicate 是函式,iterable 是可迭代物件。對於 iterable 中的元素,如果 predicate(item) 為 true,則丟棄該元素,否則返回該項及所有後續項。

groupby

groupby 用於對序列進行分組,它的使用形式如下:

其中,iterable 是一個可迭代物件,keyfunc 是分組函式,用於對 iterable 的連續項進行分組,如果不指定,則預設對 iterable 中的連續相同項進行分組,返回一個 (key, sub-iterator) 的迭代器。

ifilter

ifilter 的使用形式如下:

將 iterable 中 function(item) 為 True 的元素組成一個迭代器返回,如果 function 是 None,則返回 iterable 中所有計算為 True 的項。

ifilterfalse

ifilterfalse 的使用形式和 ifilter 類似,它將 iterable 中 function(item) 為 False 的元素組成一個迭代器返回,如果 function 是 None,則返回 iterable 中所有計算為 False 的項。

islice

islice 是切片選擇,它的使用形式如下:

其中,iterable 是可迭代物件,start 是開始索引,stop 是結束索引,step 是步長,start 和 step 可選。

imap

imap 類似 map 操作,它的使用形式如下:

imap 返回一個迭代器,元素為 func(i1, i2, i3, ...)i1i2 等分別來源於 iter, iter2

tee

tee 的使用形式如下:

tee 用於從 iterable 建立 n 個獨立的迭代器,以元組的形式返回,n 的預設值是 2。

takewhile

takewhile 的使用形式如下:

其中,predicate 是函式,iterable 是可迭代物件。對於 iterable 中的元素,如果 predicate(item) 為 true,則保留該元素,只要 predicate(item) 為 false,則立即停止迭代。

izip

izip 用於將多個可迭代物件對應位置的元素作為一個元組,將所有元組『組成』一個迭代器,並返回。它的使用形式如下:

如果某個可迭代物件不再生成值,則迭代停止。

izip_longest

izip_longestizip 類似,但迭代過程會持續到所有可迭代物件的元素都被迭代完。它的形式如下:

如果有指定 fillvalue,則會用其填充缺失的值,否則為 None。

組合生成器

itertools 模組還提供了多個組合生成器函式,用於求序列的排列、組合等:

  • product
  • permutations
  • combinations
  • combinations_with_replacement

product

product 用於求多個可迭代物件的笛卡爾積,它跟巢狀的 for 迴圈等價。它的一般使用形式如下:

其中,repeat 是一個關鍵字引數,用於指定重複生成序列的次數,

permutations

permutations 用於生成一個排列,它的一般使用形式如下:

其中,r 指定生成排列的元素的長度,如果不指定,則預設為可迭代物件的元素長度。

combinations

combinations 用於求序列的組合,它的使用形式如下:

其中,r 指定生成組合的元素的長度。

combinations_with_replacement

combinations_with_replacementcombinations 類似,但它生成的組合包含自身元素。

小結

  • itertools 模組提供了很多用於產生多種型別迭代器的函式,它們的返回值不是 list,而是迭代器。

參考連結

相關文章