python模塊分析之itertools
前言
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