網(wǎng)站域名不合法新聞最新消息
前言:
最近在leetcode刷題時用到了重疊對pairwise,這里就講解一下迭代工具函數(shù)pairwise,既介紹給大家,同時也提醒一下自己,這個pairwise其實在刷題中十分有用,相信能幫助到你。
參考官方講解:itertools --- 為高效循環(huán)創(chuàng)建迭代器的函數(shù) — Python 3.13.1 文檔
1.1基本用法:
itertools.pairwise(iterable)返回從iterable中獲取的連續(xù)的重疊對,(同時這個只有Python3.1才支持),同時輸出的迭代器二元組的數(shù)量將比輸入的數(shù)量少一個;如果輸入的可迭代對象少于兩個值,那么它將為空:
舉個例子:pairwise('ABCDEFGH')? ——> AB? BC CD DE EF FG GH
? ? ? ? ? ? ? ? ? pairwise('A') ——> None
所以在運用時要保證適用對象不少于兩個元素,否者就沒有意義。
同時pairwise 的對象時可迭代的,那么許多迭代器都可以用在里面,比用用map封裝一個迭代器,同時還可以實現(xiàn)map所指定的函數(shù),這個衍生用法在后面會詳細(xì)講解到
1.2內(nèi)在邏輯:
在了解了用法之后,我們也可以更深入的了解pairwise的實現(xiàn)邏輯:
def pairwise(iterable):iterator = iter(iterable)a = next(iterator, None)for b in iterator:yield a, ba = b
說明:
iter函數(shù):用iter(object)來生成迭代器,object是指一個支持迭代的對象,第二個參數(shù)是每次元素要調(diào)用的函數(shù),如果只是想將元素轉(zhuǎn)化為可迭代的,那么可以不傳入第二個參數(shù)
next函數(shù):用next( iterable , None )從迭代中獲取下一個元素,如果迭代器中沒有更多的元素他會引發(fā)None,當(dāng)然這個None也可以是其他響應(yīng)。同時和for函數(shù)類似,只不過,next更適合于更細(xì)粒度的控制,或者處理復(fù)雜的數(shù)據(jù)結(jié)構(gòu)。值得一提的是next訪問同一個對象是會從上一次訪問的末尾開始如果是第一次則從開頭開始訪問。
it = iter(['A','B','C'])
print(next(it, '沒有更多元素')) # 輸出 A
print(next(it, '沒有更多元素')) # 輸出 B
print(next(it, '沒有更多元素')) # 輸出 C
print(next(it, '沒有更多元素')) # 輸出 '沒有更多元素'
yield函數(shù) :把yield理解成return,區(qū)別在于前者返回一個可迭代的生成器對象,你可以使用for循環(huán)或者用next()方法遍歷生成器來提取結(jié)果,return則是直接返回所有結(jié)果,程序終止不在運行,并且銷毀局部變量。
def fun():x = 2y = 6while x < y:yield xx += 1example = fun()
# example 是一個可迭代的生成器<generator object fun at 0x0000025C491D1C00>
next(example,'No result!')
next(example,'No result!')
next(example,'No result!')
next(example,'No result!')
next(example,'No result!')
next(example,'No result!')
next(example,'No result!')
#結(jié)果:
#2
#3
#4
#5
#Nor result !
1.3運用:
運用1:
傳送門:
題型屬于分組循環(huán),分組循環(huán)可以用for或者while 實現(xiàn),題解參考靈神:?
class Solution:def longestContinuousSubstring(self, s: str) -> int:ans = cnt = 1for x, y in pairwise(map(ord, s)):cnt = cnt + 1 if x + 1 == y else 1ans = max(ans, cnt)return ans
用一個map創(chuàng)建一個可迭代的對象,并且每一個對象都用ord處理,這樣寫不僅更加簡潔
而如果每一次都比較一下Unicode碼顯然不是那么方便,當(dāng)然也可以做
class Solution:def longestContinuousSubstring(self, s: str) -> int:i,n = 0, len(s)ans = 0while i < n:start = ii += 1while i < n and ord(s[i])-1 == ord(s[i-1]):i += 1ans = max(ans, i - start)return ans
運用2:?
傳送門:
這也是分組循環(huán)里面典型的例題:,利用冒泡的思想直接排序
class Solution:def canSortArray(self, nums: List[int]) -> bool:n = len(nums)i = 0while i < n:start = iones = nums[i].bit_count()i += 1while i < n and nums[i].bit_count() == ones:i += 1nums[start:i] = sorted(nums[start:i])return all(x <= y for x, y in pairwise(nums))
今天的介紹到此為止,謝謝大家的觀看!