成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

高效的 itertools 模塊

godruoyi / 1823人閱讀

摘要:的使用形式和類似,它將中為的元素組成一個(gè)迭代器返回,如果是,則返回中所有計(jì)算為的項(xiàng)。用于將多個(gè)可迭代對(duì)象對(duì)應(yīng)位置的元素作為一個(gè)元組,將所有元組組成一個(gè)迭代器,并返回。

itertools

我們知道,迭代器的特點(diǎn)是:惰性求值(Lazy evaluation),即只有當(dāng)?shù)聊硞€(gè)值時(shí),它才會(huì)被計(jì)算,這個(gè)特點(diǎn)使得迭代器特別適合于遍歷大文件或無(wú)限集合等,因?yàn)槲覀儾挥靡淮涡詫⑺鼈兇鎯?chǔ)在內(nèi)存中。

Python 內(nèi)置的 itertools 模塊包含了一系列用來(lái)產(chǎn)生不同類型迭代器的函數(shù)或類,這些函數(shù)的返回都是一個(gè)迭代器,我們可以通過(guò) for 循環(huán)來(lái)遍歷取值,也可以使用 next() 來(lái)取值。

itertools 模塊提供的迭代器函數(shù)有以下幾種類型:

無(wú)限迭代器:生成一個(gè)無(wú)限序列,比如自然數(shù)序列 1, 2, 3, 4, ...;

有限迭代器:接收一個(gè)或多個(gè)序列(sequence)作為參數(shù),進(jìn)行組合、分組和過(guò)濾等;

組合生成器:序列的排列、組合,求序列的笛卡兒積等;

無(wú)限迭代器

itertools 模塊提供了三個(gè)函數(shù)(事實(shí)上,它們是類)用于生成一個(gè)無(wú)限序列迭代器:

count(firstval=0, step=1)

創(chuàng)建一個(gè)從 firstval (默認(rèn)值為 0) 開始,以 step (默認(rèn)值為 1) 為步長(zhǎng)的的無(wú)限整數(shù)迭代器

cycle(iterable)

對(duì) iterable 中的元素反復(fù)執(zhí)行循環(huán),返回迭代器

repeat(object [,times]

反復(fù)生成 object,如果給定 times,則重復(fù)次數(shù)為 times,否則為無(wú)限

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

count

count() 接收兩個(gè)參數(shù),第一個(gè)參數(shù)指定開始值,默認(rèn)為 0,第二個(gè)參數(shù)指定步長(zhǎng),默認(rèn)為 1:

>>> import itertools
>>>
>>> nums = itertools.count()
>>> for i in nums:
...     if i > 6:
...         break
...     print i
...
0
1
2
3
4
5
6
>>> nums = itertools.count(10, 2)    # 指定開始值和步長(zhǎng)
>>> for i in nums:
...     if i > 20:
...         break
...     print i
...
10
12
14
16
18
20
cycle

cycle() 用于對(duì) iterable 中的元素反復(fù)執(zhí)行循環(huán):

>>> import itertools
>>>
>>> cycle_strings = itertools.cycle("ABC")
>>> i = 1
>>> for string in cycle_strings:
...     if i == 10:
...         break
...     print i, string
...     i += 1
...
1 A
2 B
3 C
4 A
5 B
6 C
7 A
8 B
9 C
repeat

repeat() 用于反復(fù)生成一個(gè) object:

>>> import itertools
>>>
>>> for item in itertools.repeat("hello world", 3):
...     print item
...
hello world
hello world
hello world
>>>
>>> for item in itertools.repeat([1, 2, 3, 4], 3):
...     print item
...
[1, 2, 3, 4]
[1, 2, 3, 4]
[1, 2, 3, 4]
有限迭代器

itertools 模塊提供了多個(gè)函數(shù)(類),接收一個(gè)或多個(gè)迭代對(duì)象作為參數(shù),對(duì)它們進(jìn)行組合、分組和過(guò)濾等:

chain()

compress()

dropwhile()

groupby()

ifilter()

ifilterfalse()

islice()

imap()

starmap()

tee()

takewhile()

izip()

izip_longest()

chain

chain 的使用形式如下:

chain(iterable1, iterable2, iterable3, ...)

chain 接收多個(gè)可迭代對(duì)象作為參數(shù),將它們『連接』起來(lái),作為一個(gè)新的迭代器返回。

>>> from itertools import chain
>>>
>>> for item in chain([1, 2, 3], ["a", "b", "c"]):
...     print item
...
1
2
3
a
b
c

chain 還有一個(gè)常見的用法:

chain.from_iterable(iterable)

接收一個(gè)可迭代對(duì)象作為參數(shù),返回一個(gè)迭代器:

>>> from itertools import chain
>>>
>>> string = chain.from_iterable("ABCD")
>>> string.next()
"A"
compress

compress 的使用形式如下:

compress(data, selectors)

compress 可用于對(duì)數(shù)據(jù)進(jìn)行篩選,當(dāng) selectors 的某個(gè)元素為 true 時(shí),則保留 data 對(duì)應(yīng)位置的元素,否則去除:

>>> from itertools import compress
>>>
>>> list(compress("ABCDEF", [1, 1, 0, 1, 0, 1]))
["A", "B", "D", "F"]
>>> list(compress("ABCDEF", [1, 1, 0, 1]))
["A", "B", "D"]
>>> list(compress("ABCDEF", [True, False, True]))
["A", "C"]
dropwhile

dropwhile 的使用形式如下:

dropwhile(predicate, iterable)

其中,predicate 是函數(shù),iterable 是可迭代對(duì)象。對(duì)于 iterable 中的元素,如果 predicate(item) 為 true,則丟棄該元素,否則返回該項(xiàng)及所有后續(xù)項(xiàng)。

>>> from itertools import dropwhile
>>>
>>> list(dropwhile(lambda x: x < 5, [1, 3, 6, 2, 1]))
[6, 2, 1]
>>>
>>> list(dropwhile(lambda x: x > 3, [2, 1, 6, 5, 4]))
[2, 1, 6, 5, 4]
groupby

groupby 用于對(duì)序列進(jìn)行分組,它的使用形式如下:

groupby(iterable[, keyfunc])

其中,iterable 是一個(gè)可迭代對(duì)象,keyfunc 是分組函數(shù),用于對(duì) iterable 的連續(xù)項(xiàng)進(jìn)行分組,如果不指定,則默認(rèn)對(duì) iterable 中的連續(xù)相同項(xiàng)進(jìn)行分組,返回一個(gè) (key, sub-iterator) 的迭代器。

>>> from itertools import groupby
>>>
>>> for key, value_iter in groupby("aaabbbaaccd"):
...     print key, ":", list(value_iter)
...
a : ["a", "a", "a"]
b : ["b", "b", "b"]
a : ["a", "a"]
c : ["c", "c"]
d : ["d"]
>>>
>>> data = ["a", "bb", "ccc", "dd", "eee", "f"]
>>> for key, value_iter in groupby(data, len):    # 使用 len 函數(shù)作為分組函數(shù)
...     print key, ":", list(value_iter)
...
1 : ["a"]
2 : ["bb"]
3 : ["ccc"]
2 : ["dd"]
3 : ["eee"]
1 : ["f"]
>>>
>>> data = ["a", "bb", "cc", "ffffd", "eee", "f"]
>>> for key, value_iter in groupby(data, len):
...     print key, ":", list(value_iter)
...
1 : ["a"]
2 : ["bb", "cc"]
3 : ["ffffd", "eee"]
1 : ["f"]
ifilter

ifilter 的使用形式如下:

ifilter(function or None, sequence)

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

>>> from itertools import ifilter
>>>
>>> list(ifilter(lambda x: x < 6, range(10)))
[0, 1, 2, 3, 4, 5]
>>>
>>> list(ifilter(None, [0, 1, 2, 0, 3, 4]))
[1, 2, 3, 4]
ifilterfalse

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

>>> from itertools import ifilterfalse
>>>
>>> list(ifilterfalse(lambda x: x < 6, range(10)))
[6, 7, 8, 9]
>>>
>>> list(ifilter(None, [0, 1, 2, 0, 3, 4]))
[0, 0]
islice

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

islice(iterable, [start,] stop [, step]) 

其中,iterable 是可迭代對(duì)象,start 是開始索引,stop 是結(jié)束索引,step 是步長(zhǎng),start 和 step 可選。

>>> from itertools import count, islice
>>>
>>> list(islice([10, 6, 2, 8, 1, 3, 9], 5))
[10, 6, 2, 8, 1]
>>>
>>> list(islice(count(), 6))
[0, 1, 2, 3, 4, 5]
>>>
>>> list(islice(count(), 3, 10))
[3, 4, 5, 6, 7, 8, 9]
>>> list(islice(count(), 3, 10 ,2))
[3, 5, 7, 9]
imap

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

imap(func, iter1, iter2, iter3, ...)

imap 返回一個(gè)迭代器,元素為 func(i1, i2, i3, ...),i1i2 等分別來(lái)源于 iter, iter2。

>>> from itertools import imap
>>>
>>> imap(str, [1, 2, 3, 4])

>>>
>>> list(imap(str, [1, 2, 3, 4]))
["1", "2", "3", "4"]
>>>
>>> list(imap(pow, [2, 3, 10], [4, 2, 3]))
[16, 9, 1000]
tee

tee 的使用形式如下:

tee(iterable [,n])

tee 用于從 iterable 創(chuàng)建 n 個(gè)獨(dú)立的迭代器,以元組的形式返回,n 的默認(rèn)值是 2。

>>> from itertools import tee
>>>
>>> tee("abcd")   # n 默認(rèn)為 2,創(chuàng)建兩個(gè)獨(dú)立的迭代器
(, )
>>>
>>> iter1, iter2 = tee("abcde")
>>> list(iter1)
["a", "b", "c", "d", "e"]
>>> list(iter2)
["a", "b", "c", "d", "e"]
>>>
>>> tee("abc", 3)  # 創(chuàng)建三個(gè)獨(dú)立的迭代器
(, , )
takewhile

takewhile 的使用形式如下:

takewhile(predicate, iterable)

其中,predicate 是函數(shù),iterable 是可迭代對(duì)象。對(duì)于 iterable 中的元素,如果 predicate(item) 為 true,則保留該元素,只要 predicate(item) 為 false,則立即停止迭代。

>>> from itertools import takewhile
>>>
>>> list(takewhile(lambda x: x < 5, [1, 3, 6, 2, 1]))
[1, 3]
>>> list(takewhile(lambda x: x > 3, [2, 1, 6, 5, 4]))
[]
izip

izip 用于將多個(gè)可迭代對(duì)象對(duì)應(yīng)位置的元素作為一個(gè)元組,將所有元組『組成』一個(gè)迭代器,并返回。它的使用形式如下:

izip(iter1, iter2, ..., iterN)

如果某個(gè)可迭代對(duì)象不再生成值,則迭代停止。

>>> from itertools import izip
>>> 
>>> for item in izip("ABCD", "xy"):
...     print item
...
("A", "x")
("B", "y")
>>> for item in izip([1, 2, 3], ["a", "b", "c", "d", "e"]):
...     print item
...
(1, "a")
(2, "b")
(3, "c")
izip_longest

izip_longestizip 類似,但迭代過(guò)程會(huì)持續(xù)到所有可迭代對(duì)象的元素都被迭代完。它的形式如下:

izip_longest(iter1, iter2, ..., iterN, [fillvalue=None])

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

>>> from itertools import izip_longest
>>>
>>> for item in izip_longest("ABCD", "xy"):
...     print item
...
("A", "x")
("B", "y")
("C", None)
("D", None)
>>>
>>> for item in izip_longest("ABCD", "xy", fillvalue="-"):
...     print item
...
("A", "x")
("B", "y")
("C", "-")
("D", "-")
組合生成器

itertools 模塊還提供了多個(gè)組合生成器函數(shù),用于求序列的排列、組合等:

product

permutations

combinations

combinations_with_replacement

product

product 用于求多個(gè)可迭代對(duì)象的笛卡爾積,它跟嵌套的 for 循環(huán)等價(jià)。它的一般使用形式如下:

product(iter1, iter2, ... iterN, [repeat=1])

其中,repeat 是一個(gè)關(guān)鍵字參數(shù),用于指定重復(fù)生成序列的次數(shù),

>>> from itertools import product
>>>
>>> for item in product("ABCD", "xy"):
...     print item
...
("A", "x")
("A", "y")
("B", "x")
("B", "y")
("C", "x")
("C", "y")
("D", "x")
("D", "y")
>>>
>>> list(product("ab", range(3)))
[("a", 0), ("a", 1), ("a", 2), ("b", 0), ("b", 1), ("b", 2)]
>>>
>>> list(product((0,1), (0,1), (0,1)))
[(0, 0, 0), (0, 0, 1), (0, 1, 0), (0, 1, 1), (1, 0, 0), (1, 0, 1), (1, 1, 0), (1, 1, 1)]
>>>
>>> list(product("ABC", repeat=2))
[("A", "A"), ("A", "B"), ("A", "C"), ("B", "A"), ("B", "B"), ("B", "C"), ("C", "A"), ("C", "B"), ("C", "C")]
>>>
permutations

permutations 用于生成一個(gè)排列,它的一般使用形式如下:

permutations(iterable[, r])

其中,r 指定生成排列的元素的長(zhǎng)度,如果不指定,則默認(rèn)為可迭代對(duì)象的元素長(zhǎng)度。

>>> from itertools import permutations
>>>
>>> permutations("ABC", 2)

>>>
>>> list(permutations("ABC", 2))
[("A", "B"), ("A", "C"), ("B", "A"), ("B", "C"), ("C", "A"), ("C", "B")]
>>>
>>> list(permutations("ABC"))
[("A", "B", "C"), ("A", "C", "B"), ("B", "A", "C"), ("B", "C", "A"), ("C", "A", "B"), ("C", "B", "A")]
>>>
combinations

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

combinations(iterable, r)

其中,r 指定生成組合的元素的長(zhǎng)度。

>>> from itertools import combinations
>>>
>>> list(combinations("ABC", 2))
[("A", "B"), ("A", "C"), ("B", "C")]
combinations_with_replacement

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

>>> from itertools import combinations_with_replacement
>>>
>>> list(combinations_with_replacement("ABC", 2))
[("A", "A"), ("A", "B"), ("A", "C"), ("B", "B"), ("B", "C"), ("C", "C")]
小結(jié)

itertools 模塊提供了很多用于產(chǎn)生多種類型迭代器的函數(shù),它們的返回值不是 list,而是迭代器。

本文由 funhacks 發(fā)表于個(gè)人博客,采用 Creative Commons BY-NC-ND 4.0(自由轉(zhuǎn)載-保持署名-非商用-禁止演繹)協(xié)議發(fā)布。
非商業(yè)轉(zhuǎn)載請(qǐng)注明作者及出處。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者本人。
本文標(biāo)題為: 高效的 itertools 模塊
本文鏈接為: http://funhacks.net/2017/02/1...

參考鏈接

itertools — Functions creating iterators for efficient looping

itertools – Iterator functions for efficient looping - Python Module of the Week

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/38434.html

相關(guān)文章

  • PyTips 0x16 - Python 迭代器工具

    摘要:借鑒了中的某些迭代器的構(gòu)造方法,并在中實(shí)現(xiàn)該模塊是通過(guò)實(shí)現(xiàn),源代碼。 項(xiàng)目地址:https://git.io/pytips 0x01 介紹了迭代器的概念,即定義了 __iter__() 和 __next__() 方法的對(duì)象,或者通過(guò) yield 簡(jiǎn)化定義的可迭代對(duì)象,而在一些函數(shù)式編程語(yǔ)言(見 0x02 Python 中的函數(shù)式編程)中,類似的迭代器常被用于產(chǎn)生特定格式的列表(或序列)...

    mayaohua 評(píng)論0 收藏0
  • python高級(jí)特性

    摘要:常規(guī)的使用來(lái)統(tǒng)計(jì)一段代碼運(yùn)行時(shí)間的例子輸出結(jié)果總結(jié)其實(shí)是一門特別人性化的語(yǔ)言,但凡在工程中經(jīng)常遇到的問(wèn)題,處理起來(lái)比較棘手的模式基本都有對(duì)應(yīng)的比較優(yōu)雅的解決方案。 python的高級(jí)特性 名詞與翻譯對(duì)照表 generator 生成器 iterator 迭代器 collection 集合 pack/unpack 打包/解包 decorator 裝飾器 context manager ...

    yexiaobai 評(píng)論0 收藏0
  • Python進(jìn)階:設(shè)計(jì)模式之迭代器模式

    摘要:抓住了迭代器模式的本質(zhì),即是迭代,賦予了它極高的地位。輸出結(jié)果輸出結(jié)果小結(jié)迭代器模式幾乎是種設(shè)計(jì)模式中最常用的設(shè)計(jì)模式,本文主要介紹了是如何運(yùn)用迭代器模式,并介紹了模塊生成迭代器的種方法,以及種生成迭代器的內(nèi)置方法。 showImg(https://segmentfault.com/img/bVbmv7W?w=4272&h=2848); 在軟件開發(fā)領(lǐng)域中,人們經(jīng)常會(huì)用到這一個(gè)概念——設(shè)...

    pubdreamcc 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<