日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁(yè) > 科技  > 軟件

itertools:用于處理可迭代對(duì)象的模塊

來(lái)源: 責(zé)編: 時(shí)間:2024-03-25 17:35:10 178觀看
導(dǎo)讀Python 有一個(gè)內(nèi)置模塊 itertools,從名字可以看出它是專門用來(lái)處理可迭代對(duì)象的,那么它都支持哪些操作呢?一起來(lái)看一下吧。itertools.chain接收多個(gè)可迭代對(duì)象(或者迭代器)作為參數(shù),返回一個(gè)迭代器。它會(huì)生成所有輸入迭代器

Python 有一個(gè)內(nèi)置模塊 itertools,從名字可以看出它是專門用來(lái)處理可迭代對(duì)象的,那么它都支持哪些操作呢?一起來(lái)看一下吧。d3d28資訊網(wǎng)——每日最新資訊28at.com

itertools.chain

接收多個(gè)可迭代對(duì)象(或者迭代器)作為參數(shù),返回一個(gè)迭代器。它會(huì)生成所有輸入迭代器的元素,就好像這些元素來(lái)自一個(gè)迭代器一樣。d3d28資訊網(wǎng)——每日最新資訊28at.com

import itertoolsc = itertools.chain([1, 2, 3], "abc", {"k1": "v1", "k2": "v2"})# 直接打印的話是一個(gè)對(duì)象print(c) """<itertools.chain object at 0x00000000029745F8>"""print(list(c)) """1 2 3 a b c k1 k2"""# 還可以使用 chain.from_iterable# 參數(shù)接收多個(gè)可迭代對(duì)象組成的一個(gè)可迭代對(duì)象c = itertools.chain.from_iterable(    [[1, 2, 3], "abc", {"k1": "v1", "k2": "v2"}])print(list(c)) """1 2 3 a b c k1 k2"""

d3d28資訊網(wǎng)——每日最新資訊28at.com

itertools.zip_longest

從名字上可以看出,功能和內(nèi)置的 zip 類似。確實(shí)如此,就是將多個(gè)可迭代對(duì)象對(duì)應(yīng)位置的元素組合起來(lái),像拉鏈(zip)一樣。只不過(guò)內(nèi)置的 zip 是 "木桶原理",一方匹配到頭了,那么就不匹配了,而 zip_longest 是以長(zhǎng)的那一方為基準(zhǔn)。d3d28資訊網(wǎng)——每日最新資訊28at.com

import itertools# 內(nèi)置的 zip 是把多個(gè)迭代器對(duì)象中的每一個(gè)元素按照順序組合到一個(gè)元組中name = ["高老師", "豬哥", "S 佬"]where = ["江蘇", "北京", "深圳"]z = zip(name, where)print(z)"""<zip object at 0x00000257F3FEBEC0>"""print(list(z))"""[('高老師', '江蘇'), ('豬哥', '北京'), ('S 佬', '深圳')]"""# 但如果兩者長(zhǎng)度不一致怎么辦?name = ["高老師", "豬哥", "S 佬", "xxx"]where = ["江蘇", "北京", "深圳"]print(list(zip(name, where)))"""[('高老師', '江蘇'), ('豬哥', '北京'), ('S 佬', '深圳')]"""# 可以看到,長(zhǎng)度不一致的時(shí)候,當(dāng)一方結(jié)束之后就停止匹配# 如果想匹配長(zhǎng)的,那么可以使用 itertools 下面的 zip_longestprint(list(itertools.zip_longest(name, where))) """[('高老師', '江蘇'), ('豬哥', '北京'), ('S 佬', '深圳'), ('xxx', None)]"""# 默認(rèn)使用 None 進(jìn)行匹配,當(dāng)然我們也可以指定內(nèi)容print(list(itertools.zip_longest(name, where, fillvalue="中國(guó)")))"""[('高老師', '江蘇'), ('豬哥', '北京'), ('S 佬', '深圳'), ('xxx', '中國(guó)')]"""

d3d28資訊網(wǎng)——每日最新資訊28at.com

itertools.islice

如果一個(gè)迭代器里面包含了很多元素,我們只想要一部分的話,可以使用 islice,按照索引從迭代器中返回所選擇的元素,并且得到的還是一個(gè)迭代器。d3d28資訊網(wǎng)——每日最新資訊28at.com

import itertoolsnum = range(20)# 選擇 index=5 到 index=10(不包含)的位置s = itertools.islice(num, 5, 10)print(list(s))  # [5, 6, 7, 8, 9]# 選擇開(kāi)頭到 index=5 的位置s = itertools.islice(num, 5)print(list(s))  # [0, 1, 2, 3, 4]# 選擇從 index=5 到 index=15(不包含)的位置,步長(zhǎng)為 3s = itertools.islice(num, 5, 15, 3)print(list(s))  # [5, 8, 11, 14]

注意:islice 不支持負(fù)數(shù)索引,因?yàn)椴恢赖饔卸嚅L(zhǎng),除非全部讀取,可是那樣的話干嘛不直接轉(zhuǎn)為列表之后再用切片獲取呢?d3d28資訊網(wǎng)——每日最新資訊28at.com

之所以使用 islice 這種形式,就是為了在不全部讀取的情況下,也能選擇出我們想要的部分,所以這種方式只支持從前往后,不能從后往前。d3d28資訊網(wǎng)——每日最新資訊28at.com

itertools.tee

將一個(gè)可迭代對(duì)象拷貝 n 份。d3d28資訊網(wǎng)——每日最新資訊28at.com

import itertoolsr = [1, 2, 3, 4, 5]i1, i2 = itertools.tee(r, 2)print(list(i1))  # [1, 2, 3, 4, 5]print(list(i2))  # [1, 2, 3, 4, 5]

d3d28資訊網(wǎng)——每日最新資訊28at.com

itertools.countd3d28資訊網(wǎng)——每日最新資訊28at.com

import itertools"""count(start=0, step=1) 返回一個(gè)迭代器,負(fù)責(zé)無(wú)限地生成連續(xù)的整數(shù)接收兩個(gè)參數(shù):起始(默認(rèn)為0)和步長(zhǎng)(默認(rèn)為1)等價(jià)于:def count(firstval=0, step=1):    x = firstval    while 1:        yield x        x += step"""# 起始值為 5,步長(zhǎng)為 2c1 = itertools.count(5, 2)print(list(itertools.islice(c1, 5))) """[5, 7, 9, 11, 13]"""

d3d28資訊網(wǎng)——每日最新資訊28at.com

itertools.cycle

import itertools"""cycle(iterable) 返回一個(gè)迭代器,會(huì)無(wú)限重復(fù)里面的內(nèi)容,直到內(nèi)存耗盡"""c2 = itertools.cycle("abc")print(list(itertools.islice(c2, 10)))"""['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'a']"""

d3d28資訊網(wǎng)——每日最新資訊28at.com

itertools.repeat

import itertools"""repeat(obj, times=None),無(wú)限重復(fù) obj,除非指定 times"""# 重復(fù)指定的次數(shù)print(list(itertools.repeat("abc", 3))) """['abc', 'abc', 'abc']"""

d3d28資訊網(wǎng)——每日最新資訊28at.com

itertools.dropwhile

刪除滿足條件的值,注意:是刪除。d3d28資訊網(wǎng)——每日最新資訊28at.com

import itertoolsl = [1, 2, 3, 4, 5]drop_l = itertools.dropwhile(lambda x: x < 3, l)# 依舊返回迭代器print(drop_l) """<itertools.dropwhile object at 0x000001AD63AD0488>"""# 可以看到小于3的都被丟掉了print(list(drop_l))  """[3, 4, 5]"""

d3d28資訊網(wǎng)——每日最新資訊28at.com

itertools.takewhile

這個(gè)和 filter 是一樣的,保留滿足條件的值。d3d28資訊網(wǎng)——每日最新資訊28at.com

import itertoolsl = [1, 2, 3, 4, 5]take_l = itertools.takewhile(lambda x: x < 3, l)print(take_l) """<itertools.takewhile object at 0x000001D37F512948>"""print(list(take_l)) """[1, 2]"""filter_l = filter(lambda x: x < 3, l)print(list(filter_l))  """[1, 2]"""

d3d28資訊網(wǎng)——每日最新資訊28at.com

itertools.compress

提供了另一種過(guò)濾可迭代對(duì)象元素的方法。d3d28資訊網(wǎng)——每日最新資訊28at.com

import itertoolscondition = [True, False, True, True, False]data = [1, 2, 3, 4, 5]print(list(itertools.compress(data, condition))) """[1, 3, 4]"""# 除了指定 True 和 False,還可以使用 Python 其它類型的值# 會(huì)以其對(duì)應(yīng)的布爾值作為判斷依據(jù)condition = [1, 0, "x", "x", {}]  print(list(itertools.compress(data, condition))) """[1, 3, 4]"""

d3d28資訊網(wǎng)——每日最新資訊28at.com

itertools.accumulated3d28資訊網(wǎng)——每日最新資訊28at.com

accumulate 處理輸入的序列,得到一個(gè)類似于斐波那契的結(jié)果。d3d28資訊網(wǎng)——每日最新資訊28at.com

import itertoolsprint(list(itertools.accumulate(range(5))))  """[0, 1, 3, 6, 10]"""print(list(itertools.accumulate("abcde")))  """["a", "ab", "abc", "abcd", "abcde"]"""# 所以這里的相加還要看具體的含義try:    print(list(itertools.accumulate([[1, 2], (3, 4)])))except TypeError as e:    print(e)      """    can only concatenate list (not "tuple") to list    """    # 這里就顯示無(wú)法將列表和元組相加# 當(dāng)然也可以自定義data = [1, 2, 3, 4, 5]method = lambda x, y: x * yprint(list(itertools.accumulate(data, method))) """[1, 2, 6, 24, 120]"""# 可以看到這里的結(jié)果就改變了

d3d28資訊網(wǎng)——每日最新資訊28at.com

itertools.productd3d28資訊網(wǎng)——每日最新資訊28at.com

product 則是會(huì)將多個(gè)可迭代對(duì)象組合成一個(gè)笛卡爾積。d3d28資訊網(wǎng)——每日最新資訊28at.com

import itertoolsprint(list(itertools.product([1, 2, 3], [2, 3]))) """[(1, 2), (1, 3), (2, 2), (2, 3), (3, 2), (3, 3)]"""

d3d28資訊網(wǎng)——每日最新資訊28at.com

itertools.permutationsd3d28資訊網(wǎng)——每日最新資訊28at.com

import itertoolsdata = [1, 2, 3, 4]print(list(itertools.permutations(data)))# 根據(jù)排列組合,顯然是 A44,總共 4 * 3 * 2 * 1 = 24 種組合"""[(1, 2, 3, 4), (1, 2, 4, 3), (1, 3, 2, 4), (1, 3, 4, 2), (1, 4, 2, 3), (1, 4, 3, 2),(2, 1, 3, 4), (2, 1, 4, 3), (2, 3, 1, 4), (2, 3, 4, 1), (2, 4, 1, 3), (2, 4, 3, 1),(3, 1, 2, 4), (3, 1, 4, 2), (3, 2, 1, 4), (3, 2, 4, 1), (3, 4, 1, 2), (3, 4, 2, 1),(4, 1, 2, 3), (4, 1, 3, 2), (4, 2, 1, 3), (4, 2, 3, 1), (4, 3, 1, 2), (4, 3, 2, 1)]"""# 結(jié)果是 A42,總共 4 * 3 = 12 種組合print(list(itertools.permutations(data, 2)))"""[(1, 2), (1, 3), (1, 4),  (2, 1), (2, 3), (2, 4),  (3, 1), (3, 2), (3, 4),  (4, 1), (4, 2), (4, 3)]"""

d3d28資訊網(wǎng)——每日最新資訊28at.com

itertools.combinationsd3d28資訊網(wǎng)——每日最新資訊28at.com

permutations 顯然是考慮了順序,相當(dāng)于排列組合里面 A,而 combinations 只考慮元素是否一致,而不管順序,相當(dāng)于排列組合里面的 C。d3d28資訊網(wǎng)——每日最新資訊28at.com

import itertools# permutations 只要順序不同就看做一種結(jié)果# combinations 則保證只要元素相同就是同一種結(jié)果data = "abcd"print(list(itertools.combinations(data, 3)))  """[('a', 'b', 'c'), ('a', 'b', 'd'), ('a', 'c', 'd'), ('b', 'c', 'd')]"""# 如果拿抽小球來(lái)作比喻的話,顯然 combinations 是不放回的,也就是不會(huì)重復(fù)單個(gè)的輸入元素# 但有時(shí)候可能也需要考慮包含重復(fù)元素的組合,相當(dāng)于抽小球的時(shí)候有放回# 對(duì)于這種情況,可以使用 combinations_with_replacementprint(list(itertools.combinations_with_replacement(data, 3)))"""[('a', 'a', 'a'), ('a', 'a', 'b'), ('a', 'a', 'c'), ('a', 'a', 'd'), ('a', 'b', 'b'),('a', 'b', 'c'), ('a', 'b', 'd'), ('a', 'c', 'c'), ('a', 'c', 'd'), ('a', 'd', 'd'),('b', 'b', 'b'), ('b', 'b', 'c'), ('b', 'b', 'd'), ('b', 'c', 'c'), ('b', 'c', 'd'),('b', 'd', 'd'), ('c', 'c', 'c'), ('c', 'c', 'd'), ('c', 'd', 'd'), ('d', 'd', 'd')]"""

d3d28資訊網(wǎng)——每日最新資訊28at.com

以上就是該模塊的用法,但說(shuō)實(shí)話,感覺(jué)大部分都沒(méi)啥卵用。d3d28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-79141-0.htmlitertools:用于處理可迭代對(duì)象的模塊

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 快速了解CSS表單尺寸屬性field-sizing

下一篇: Spring Boot郵件發(fā)送教程:步步為營(yíng),輕松實(shí)現(xiàn)圖片附件郵件!

標(biāo)簽:
  • 熱門焦點(diǎn)
Top 主站蜘蛛池模板: 乳山市| 宜阳县| 桃园市| 花莲县| 灌云县| 澄江县| 兴安盟| 庐江县| 杭州市| 宜春市| 楚雄市| 家居| 翁源县| 丽水市| 桃园县| 曲周县| 万年县| 南岸区| 读书| 汨罗市| 武定县| 凤庆县| 景东| 铜梁县| 新竹市| 剑河县| 清水县| 裕民县| 长白| 长沙县| 富宁县| 睢宁县| 射阳县| 黄陵县| 柞水县| 栾川县| 疏勒县| 阳谷县| 滨海县| 琼海市| 泰顺县|