Python標(biāo)準(zhǔn)庫之——itertools模塊

itertools模塊

迭代器(生成器)在Python中是一種很常用也很好用的數(shù)據(jù)結(jié)構(gòu),比起列表(list)來說仍侥,迭代器最大的優(yōu)勢就是延遲計(jì)算要出,按需使用,從而提高開發(fā)體驗(yàn)和運(yùn)行效率农渊,以至于在Python 3中map,filter等操作返回的不再是列表而是迭代器患蹂。

itertools.count()

count()創(chuàng)建一個無限的迭代器,可以指定起始位置和步長砸紊,會不停打印出自然數(shù)序列传于,當(dāng)然你可以break跳出循環(huán)。

>>> import itertools
>>> natuals = itertools.count(1, 2)
>>> for n in natuals:
...     print(n)
...
1
3
5
...
itertools.cycle()

cycle()會把傳入的一個序列無限重復(fù)下去醉顽。

>>> import itertools
>>> cs = itertools.cycle('ABC') # 注意字符串也是序列的一種
>>> for c in cs:
...     print(c)
...
'A'
'B'
'C'
'A'
'B'
'C'
...
itertools.repeat()

repeat()負(fù)責(zé)把一個元素?zé)o限重復(fù)下去沼溜,不過如果提供第二個參數(shù)就可以限定重復(fù)次數(shù)。

>>> ns = itertools.repeat('A', 3)
>>> for n in ns:
...     print(n)
...
A
A
A

上述幾種迭代器稱為無限迭代器游添,只有在for迭代時才會無限地迭代下去系草,如果只是創(chuàng)建了一個迭代對象,它不會事先把無限個元素生成出來唆涝,事實(shí)上也不可能在內(nèi)存中創(chuàng)建無限多個元素找都。

無限迭代器雖然可以無限迭代下去,但是通常我們會通過takewhile()等函數(shù)根據(jù)條件判斷來截取出一個有限的序列:

>>> natuals = itertools.count(1)
>>> ns = itertools.takewhile(lambda x: x < 5, natuals)
>>> list(ns)
[1, 2, 3, 4]

dropwhile()與takewhile()相反:

>>> natuals = itertools.dropwhile(lambda x: x < 5, range(10)) 
>>> print(list(natuals)) 
[5, 6, 7, 8, 9] 
itertools.chain()

chain()可以把一組迭代對象串聯(lián)起來石抡,形成一個更大的迭代器:

>>> for c in itertools.chain('ABC', 'XYZ'):
...     print(c)
'A' 'B' 'C' 'X' 'Y' 'Z'
itertools.groupby()

groupby()把迭代器中相鄰的重復(fù)元素挑出來放在一起:

>>> for key, group in itertools.groupby('AAABBBCCAAA'):
...     print(key, list(group))
...
A ['A', 'A', 'A']
B ['B', 'B', 'B']
C ['C', 'C']
A ['A', 'A', 'A']

實(shí)際上挑選規(guī)則是通過函數(shù)完成的檐嚣,只要作用于函數(shù)的兩個元素返回的值相等,這兩個元素就被認(rèn)為是在一組的,而函數(shù)返回值作為組的key嚎京。如果我們要忽略大小寫分組嗡贺,就可以讓元素'A'和'a'都返回相同的key:

>>> for key, group in itertools.groupby('AaaBBbcCAAa', lambda c: c.upper()):
...     print(key, list(group))
...
A ['A', 'a', 'a']
B ['B', 'B', 'b']
C ['c', 'C']
A ['A', 'A', 'a']
>>> for key, group in itertools.groupby(range(10), lambda x: x < 5 or x > 8):
... print(key, list(group))              
True [0, 1, 2, 3, 4]         
False [5, 6, 7, 8]         
True [9] 
itertools.accumulate()

accumulate()將返回累計(jì)求和結(jié)果,或者傳入兩個參數(shù)的話鞍帝,由傳入的函數(shù)累積計(jì)算的結(jié)果诫睬。默認(rèn)設(shè)定為累加。

>>> list(itertools.accumulate(range(10)))
[0, 1, 3, 6, 10, 15, 21, 28, 36, 45]

accumulate(可迭代對象[, 函數(shù)])

>>> import operator
>>> list(accumulate(range(1, 5), operator.mul))
[1, 2, 6, 24]
itertools.combinations()

求列表或生成器中指定數(shù)目的元素不重復(fù)的所有組合。

>>> natuals = itertools.combinations(range(4), 3) 
>>> print(list(natuals)) 
[(0, 1, 2), (0, 1, 3), (0, 2, 3), (1, 2, 3)] 
itertools.combinations_with_replacement()

允許重復(fù)元素的組合。

>>> natuals = itertools.combinations_with_replacement('ABC', 2) 
>>> print(list(natuals)) 
[('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'B'), ('B', 'C'), ('C', 'C')] 
itertools.permutations()

產(chǎn)生指定數(shù)目的元素的所有排列(順序有關(guān)):

>>> natuals = itertools.permutations('abc', 3) 
>>> print(list(natuals)) 
['a', 'b', 'c'], ['a', 'c', 'b'], ['b', 'a', 'c'], ['b', 'c', 'a'], ['c', 'a', 'b']['c', 'b', 'a']
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末送火,一起剝皮案震驚了整個濱河市牵现,隨后出現(xiàn)的幾起案子几蜻,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異床绪,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)其弊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進(jìn)店門癞己,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人梭伐,你說我怎么就攤上這事痹雅。” “怎么了糊识?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵绩社,是天一觀的道長。 經(jīng)常有香客問我技掏,道長铃将,這世上最難降的妖魔是什么项鬼? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任哑梳,我火速辦了婚禮,結(jié)果婚禮上绘盟,老公的妹妹穿的比我還像新娘鸠真。我一直安慰自己,他們只是感情好龄毡,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布吠卷。 她就那樣靜靜地躺著,像睡著了一般沦零。 火紅的嫁衣襯著肌膚如雪祭隔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天路操,我揣著相機(jī)與錄音疾渴,去河邊找鬼千贯。 笑死,一個胖子當(dāng)著我的面吹牛搞坝,可吹牛的內(nèi)容都是我干的搔谴。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼桩撮,長吁一口氣:“原來是場噩夢啊……” “哼敦第!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起店量,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤芜果,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后融师,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體师幕,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年诬滩,在試婚紗的時候發(fā)現(xiàn)自己被綠了霹粥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡疼鸟,死狀恐怖后控,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情空镜,我是刑警寧澤浩淘,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站吴攒,受9級特大地震影響张抄,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜洼怔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一署惯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧镣隶,春花似錦极谊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至域那,卻和暖如春咙边,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工败许, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留友瘤,地道東北人。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓檐束,卻偏偏與公主長得像辫秧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子被丧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內(nèi)容

  • PYTHON-進(jìn)階-ITERTOOLS模塊小結(jié)轉(zhuǎn)自wklken:http://wklken.me/posts/20...
    C_Y_閱讀 974評論 0 2
  • 圖片匯總: ITERTOOLS是一個高效循環(huán)的迭代函數(shù)集合盟戏。正好在最近的應(yīng)用的時候用的比較多,網(wǎng)上幾個比較詳細(xì)的介...
    _Cappuccino_閱讀 12,657評論 0 1
  • ITERTOOLS是一個高效循環(huán)的迭代函數(shù)集合甥桂。正好在最近的應(yīng)用的時候用的比較多柿究,網(wǎng)上幾個比較詳細(xì)的介紹帖子要么寫...
    kivinsae閱讀 3,016評論 1 10
  • 最近心情喪到極點(diǎn),瑣事一大堆黄选,可能是我想的太多
    顧果閱讀 127評論 0 0
  • 應(yīng)該聯(lián)系覺察別人的所有一切蝇摸,別人的思維和心智,之前自己沒有這方面的思維办陷,或者少一點(diǎn)貌夕。所以總結(jié)自己少點(diǎn)什么,通過寫日...
    691bd9461501閱讀 112評論 0 0