itertools 庫

itertools 庫

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

話雖這么說但大家平時(shí)用到的迭代器大概只有range了,而通過iter函數(shù)把列表對象轉(zhuǎn)化為迭代器對象又有點(diǎn)多此一舉莫鸭,這時(shí)候我們今天的主角itertools就該上場了闹丐。

使用itertools

  • itertools中的函數(shù)大多是返回各種迭代器對象,其中很多函數(shù)的作用我們平時(shí)要寫很多代碼才能達(dá)到被因,而在運(yùn)行效率上反而更低卿拴,畢竟人家是系統(tǒng)庫。

itertools.accumulate

簡單來說就是累加梨与。
>>> import itertools
>>> x = itertools.accumulate(range(10))
>>> print(list(x))
[0, 1, 3, 6, 10, 15, 21, 28, 36, 45]

itertools.chain

連接多個(gè)列表或者迭代器堕花。
>>> x = itertools.chain(range(3), range(4), [3,2,1])
>>> print(list(x))
[0, 1, 2, 0, 1, 2, 3, 3, 2, 1]

itertools.combinations

求列表或生成器中指定數(shù)目的元素不重復(fù)的所有組合
>>> x = itertools.combinations(range(4), 3)
>>> print(list(x))
[(0, 1, 2), (0, 1, 3), (0, 2, 3), (1, 2, 3)]

itertools.combinations_with_replacement

允許重復(fù)元素的組合
>>> x = itertools.combinations_with_replacement('ABC', 2)
>>> print(list(x))
[('A', 'A'), ('A', 'B'), ('A', 'C'), ('B', 'B'), ('B', 'C'), ('C', 'C')]

itertools.compress

按照真值表篩選元素
>>> x = itertools.compress(range(5), (True, False, True, True, False))
>>> print(list(x))
[0, 2, 3]

itertools.count

就是一個(gè)計(jì)數(shù)器,可以指定起始位置和步長
>>> x = itertools.count(start=20, step=-1)
>>> print(list(itertools.islice(x, 0, 10, 1)))
[20, 19, 18, 17, 16, 15, 14, 13, 12, 11]

itertools.cycle

循環(huán)指定的列表和迭代器
>>> x = itertools.cycle('ABC')
>>> print(list(itertools.islice(x, 0, 10, 1)))
['A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C', 'A']

itertools.dropwhile

按照真值函數(shù)丟棄掉列表和迭代器前面的元素
>>> x = itertools.dropwhile(lambda e: e < 5, range(10))
>>> print(list(x))
[5, 6, 7, 8, 9]

itertools.filterfalse

保留對應(yīng)真值為False的元素
>>> x = itertools.filterfalse(lambda e: e < 5, (1, 5, 3, 6, 9, 4))
>>> print(list(x))
[5, 6, 9]

itertools.groupby

按照分組函數(shù)的值對元素進(jìn)行分組
>>> x = itertools.groupby(range(10), lambda x: x < 5 or x > 8)                                                                                                
>>> for condition, numbers in x:                                                  
...     print(condition, list(numbers))                                                                                                        
True [0, 1, 2, 3, 4]                                                              
False [5, 6, 7, 8]                                                                
True [9]

itertools.islice

上文使用過的函數(shù),對迭代器進(jìn)行切片
>>> x = itertools.islice(range(10), 0, 9, 2)
>>> print(list(x))
[0, 2, 4, 6, 8] 

itertools.permutations

產(chǎn)生指定數(shù)目的元素的所有排列(順序有關(guān))
>>> x = itertools.permutations(range(4), 3)
>>> print(list(x))
[(0, 1, 2), (0, 1, 3), (0, 2, 1), (0, 2, 3), (0, 3, 1), (0, 3, 2), (1, 0, 2), (1, 0, 3), (1, 2, 0), (1, 2, 3), (1, 3, 0), (1, 3, 2), (2, 0, 1), (2, 0, 3), (2, 1, 0), (2, 1, 3), (2, 3, 0), (2, 3, 1), (3, 0, 1), (3, 0, 2), (3, 1, 0), (3, 1, 2), (3, 2, 0), (3, 2, 1)]

itertools.product

產(chǎn)生多個(gè)列表和迭代器的(積)
>>> x = itertools.product('ABC', range(3))
>>>
>>> print(list(x))
[('A', 0), ('A', 1), ('A', 2), ('B', 0), ('B', 1), ('B', 2), ('C', 0), ('C', 1), ('C', 2)]

itertools.repeat

簡單的生成一個(gè)擁有指定數(shù)目元素的迭代器
>>> x = itertools.repeat(0, 5)
>>> print(list(x))
[0, 0, 0, 0, 0] 

itertools.starmap

類似map
>>> x = itertools.starmap(str.islower, 'aBCDefGhI')
>>> print(list(x))
[True, False, False, False, True, True, False, True, False]

itertools.takewhile

與dropwhile相反粥鞋,保留元素直至真值函數(shù)值為假缘挽。
>>> x = itertools.takewhile(lambda e: e < 5, range(10))
>>> print(list(x))
[0, 1, 2, 3, 4]

itertools.tee

這個(gè)函數(shù)我也不是很懂,似乎是生成指定數(shù)目的迭代器
>>> x = itertools.tee(range(10), 2)
>>> for letters in x:
...     print(list(letters))
...
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]  

itertools.zip_longest

類似于zip呻粹,不過已較長的列表和迭代器的長度為準(zhǔn)
>>> x = itertools.zip_longest(range(3), range(5))
>>> y = zip(range(3), range(5))
>>> print(list(x))
[(0, 0), (1, 1), (2, 2), (None, 3), (None, 4)]
>>> print(list(y))
[(0, 0), (1, 1), (2, 2)]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末壕曼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子尚猿,更是在濱河造成了極大的恐慌窝稿,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凿掂,死亡現(xiàn)場離奇詭異伴榔,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)庄萎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門踪少,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人糠涛,你說我怎么就攤上這事援奢。” “怎么了忍捡?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵集漾,是天一觀的道長。 經(jīng)常有香客問我砸脊,道長具篇,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任凌埂,我火速辦了婚禮驱显,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己埃疫,他們只是感情好伏恐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著栓霜,像睡著了一般翠桦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上胳蛮,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天秤掌,我揣著相機(jī)與錄音,去河邊找鬼鹰霍。 笑死,一個(gè)胖子當(dāng)著我的面吹牛茵乱,可吹牛的內(nèi)容都是我干的茂洒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼瓶竭,長吁一口氣:“原來是場噩夢啊……” “哼督勺!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起斤贰,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤智哀,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后荧恍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瓷叫,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年送巡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了摹菠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,926評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡骗爆,死狀恐怖次氨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情摘投,我是刑警寧澤煮寡,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站犀呼,受9級特大地震影響幸撕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜圆凰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一杈帐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦挑童、人聲如沸累铅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽娃兽。三九已至,卻和暖如春尽楔,著一層夾襖步出監(jiān)牢的瞬間投储,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工阔馋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留玛荞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓呕寝,卻偏偏與公主長得像勋眯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子下梢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評論 2 354

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