1. 程式人生 > >python模塊分析之itertools

python模塊分析之itertools

.org UNC ref pro red map函數 val 進行 cat

前言

itertools模塊是python內置的叠代器模塊,定義了可生成多種叠代器的函數,用來代替可叠代對象的遍歷等操作,節約內存。

叠代器函數的類型

  • 無限叠代器:包括count、cycle、repeat,用於生成無限序列的叠代器;

  • 有限叠代器:接收一個或多個序列作為參數,進行組合、分組和過濾等;

  • 組合生成器:多個序列的排列、組合等

無限叠代器

count

count本身是一個叠代器,實現了__iter__和__next__方法,用來生成無限的數字序列。

# 參數:
start=0:叠代的起點
step=1:步長

for i in count():
    print(i)
    if i == 1000:
        break

accumulate

accumulate對一個序列的數據進行積累。

# 參數
iterable:可叠代對象
func:指定規則
from itertools import accumulate
print(list(accumulate([1,2,3,4], func=lambda x,y:x + y))) # 這是默認的規則
# 結果
[1, 3, 6, 10]

cycle

叠代器,對叠代對象進行無限的重復叠代。

# 參數:
iterable:可叠代對象

from itertools import cycle
j = 0
for i in cycle(range(2)):
    j += 1
    print(i) # 結果:0 1 0 1 0 1
    if j == 6:
        break

repeat

repeat用於反復生成相同的對象,註意它們其實指向的是同一個對象,只是生成了眾多的引用。

# 參數
p_object:任何對象;
times:生成的次數,默認是無限的;

from itertools import repeat
for i in repeat([1,2,3], times=2):
    print(i) 

有限叠代器

叠代器拼接chain

chain可將多個叠代器拼接返回新的叠代器。

# 參數為眾多的可叠代對象
from itertools import chain

x = list(chain(range(5),range(4)))
print(x) # [0, 1, 2, 3, 4, 0, 1, 2, 3]

數據篩選compress

compress 可用於對數據進行篩選,當 selectors 的某個元素為 true 時,則保留 data 對應位置的元素,否則去除,data位置不夠默認為false。

# 參數
data:待篩選數據 
selectors:篩選規則

from itertools import compress
x = list(compress({‘name‘:‘‘,‘age‘:‘‘}, [0,1]))
print(x) # [‘age‘]

數據分組groupby

groupby叠代器對可叠代對象的元素按指定的規則分組。

# 參數
data:需要分組的可叠代對象
key:分組規則

from itertools import groupby
x = groupby([‘name‘,‘age‘], key=len)
print([(x, list(y)) for x, y in x]) # [(4, [‘name‘]), (3, [‘age‘])]

數據過濾

  • dropwhile:
# 參數
predicate:過濾函數
iterable:叠代對象
from itertools import dropwhile
print(list(dropwhile(lambda x:x<1,[False,False,1,2,3]))) # [1, 2, 3]

對於 iterable 中的元素,如果 predicate(item) 為 true,則丟棄該元素,否則返回該項及所有後續項;如果所有的元素都返回False,那麽全部保留。

  • takewhile
# 參數
predicate:過濾函數
iterable:叠代對象

takewhile和dropwhile叠代器剛好相反,對於 iterable 中的元素,如果 predicate(item) 為 true,則保留該元素,只要 predicate(item) 為 false,則立即停止叠代,返回被叠代過的保留的元素。

  • filterfalse
from itertools import filterfalse
print(list(filterfalse(None, [‘‘, 1, []])))

filterfalse的過濾條件和內置函數filter剛好相反,保留返回false而丟棄返回True的元素。

  • ifilter:在py2中存在,py3已去除,使用內置函數filter替代。

  • starmap

starmap的功能和map函數非常相似,不過starmap的可叠代對象參數必須是元組序列。

from itertools import starmap
print(list(starmap(lambda x:x, [[1,],[3,]])))

數據切片

  • islice
# 參數
iterable:可叠代對象,支持字典和集合的切片,但返回的結果未知。
start: 起點
stop:終點
step:步長
from itertools import islice
print(list(islice([5,4,3,4,5,6],1,3,1)))

叠代器重復創建tee

from itertools import tee, takewhile
for t in tee([1,2,3], 4):
    print(t)
    print(id(t))

tee創建的多個叠代器都是相互獨立的對象,默認創建兩個獨立的叠代器。

打包叠代器

  • izip:py2中存在,和py3的內置函數zip的功能相同。

  • zip_longest

# 參數
*iter:多個可叠代對象
fillvalue:缺失值的默認
from itertools import zip_longest
for z in zip_longest([1,2,3],[1,2],fillvalue=10):
    print(z)

zip_longest和zip的功能相似,但是zip_longest會將所有的元素叠代完成,不夠的用默認值替代。

組合生成器

組合生成器用來求多個序列的排列組合。

  • product:求多個可叠代對象的笛卡爾積;

  • permutations:生成元素不可重復的排列;

  • combinations:生成元素不可重復的組合;

  • combinations_with_replacement:生成元素可重復的組合;

總結

  • 一般來說,如果能夠用叠代器的場景盡量使用叠代器,可以極大改善內存使用狀況;

  • 本模塊比較常用的叠代器為:chain,dropwhilezip_longest.

參考

  • https://docs.python.org/3/

  • http://python.jobbole.com/87380/

python模塊分析之itertools