Python中bisect模塊與堆操作詳解
在Python中,bisect和heapq都是處理有序序列的常見模塊,本文將分別介紹這兩個(gè)模塊的用法和實(shí)現(xiàn)方式。
bisect模塊
bisect模塊提供了一些函數(shù),實(shí)現(xiàn)了對(duì)一個(gè)序列進(jìn)行排序及維護(hù)已排序序列的一個(gè)二分查找。具體來說,bisect模塊主要提供了兩個(gè)函數(shù):bisect和insort。
bisect函數(shù)
bisect函數(shù)是一個(gè)通用的二分查找工具,它可以用來查找一個(gè)元素在已排序的序列中應(yīng)該插入的位置,以維持序列的排序。具體用法如下:
import bisect # 初始化一個(gè)已排序的列表 lst = [1, 3, 4, 5, 7, 9] # 使用bisect函數(shù)查找元素插入位置 pos = bisect.bisect(lst, 6) print(pos)
運(yùn)行這段代碼可以發(fā)現(xiàn),變量pos輸出的是4,即元素6應(yīng)該插入到列表中索引為4的位置,這個(gè)列表就能保持升序排列。
insort函數(shù)
insort函數(shù)是bisect函數(shù)的變種,它可以在查找到插入位置的同時(shí)插入元素。具體用法和bisect類似,只是調(diào)用的函數(shù)不同,如下:
import bisect # 初始化一個(gè)已排序的列表 lst = \[1, 3, 4, 5, 7, 9] # 使用insort函數(shù)插入元素 bisect.insort(lst, 6) print(lst)
運(yùn)行這段代碼可以得到輸出:
\[1, 3, 4, 5, 6, 7, 9]
這個(gè)函數(shù)接受兩個(gè)參數(shù),第一個(gè)參數(shù)是已排序的序列,第二個(gè)參數(shù)是要插入的元素。該函數(shù)會(huì)將元素插入到序列的正確位置。
heapq模塊
heapq模塊是一個(gè)堆隊(duì)列算法模塊,提供了在列表上進(jìn)行堆操作的函數(shù)。下面我們來看一下heapq模塊如何實(shí)現(xiàn)堆。
初始化堆
首先,初始化一個(gè)空堆和向堆中插入元素的方法如下:
import heapq # 初始化一個(gè)空堆 heap = \[] # 往堆中插入元素 heapq.heappush(heap, 3) heapq.heappush(heap, 1) heapq.heappush(heap, 7) heapq.heappush(heap, 6)
以上代碼先用heap的索引為0的位置存儲(chǔ)根節(jié)點(diǎn)的值,以此類推往下存儲(chǔ)每個(gè)節(jié)點(diǎn)的值,然后在heap中插入元素使用的是heapq.heappush函數(shù)。插入后的堆如下圖所示:
1
\
3
\
7
/
6
彈出元素
從堆中彈出元素使用的是heapq.heappop函數(shù),由于我們使用的是最小堆,根節(jié)點(diǎn)的值是最小的。彈出元素的代碼如下:
# 從堆中彈出元素 print(heapq.heappop(heap)) print(heapq.heappop(heap)) print(heapq.heappop(heap)) print(heapq.heappop(heap))
運(yùn)行以上代碼可以看到輸出:
1
3
6
7
這里的堆是使用數(shù)組實(shí)現(xiàn)的最小堆(根節(jié)點(diǎn)的值是最小的),如果要實(shí)現(xiàn)最大堆,可以在插入元素時(shí)取反,在彈出元素時(shí)再取反。
總結(jié)
Python的bisect模塊和heapq模塊分別用來操作有序序列和堆。bisect模塊提供了二分查找和插入元素的函數(shù),heapq模塊則提供了堆操作的函數(shù)。熟練使用這些模塊能夠提高編碼效率,并加深對(duì)數(shù)據(jù)結(jié)構(gòu)和算法的理解。
到此這篇關(guān)于Python中bisect模塊與堆操作詳解的文章就介紹到這了,更多相關(guān)Python bisect heapq內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python統(tǒng)計(jì)中文詞頻的四種方法小結(jié)
統(tǒng)計(jì)中文詞頻是Python考試中常見的操作,本文我們總結(jié)了四種常見的中文詞頻統(tǒng)計(jì)方法,并列出代碼,具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08
淺談Python中文件夾和python package包的區(qū)別
這篇文章主要介紹了淺談Python中文件夾和python package包的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-06-06
解決python中os.listdir()函數(shù)讀取文件夾下文件的亂序和排序問題
今天小編就為大家分享一篇解決python中os.listdir()函數(shù)讀取文件夾下文件的亂序和排序問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-10-10
python3中獲取文件當(dāng)前絕對(duì)路徑的兩種方法
下面小編就為大家分享一篇python3中獲取文件當(dāng)前絕對(duì)路徑的兩種方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-04-04
python將一個(gè)英文語(yǔ)句以單詞為單位逆序排放的方法
今天小編就為大家分享一篇python將一個(gè)英文語(yǔ)句以單詞為單位逆序排放的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-12-12
關(guān)于Python使用logging庫(kù)進(jìn)行有效日志管理的方法詳解
在開發(fā)大型軟件或處理復(fù)雜問題時(shí),我們經(jīng)常需要一種方法來記錄和跟蹤程序的運(yùn)行狀態(tài),Python 提供了一個(gè)名為 logging 的標(biāo)準(zhǔn)庫(kù),可以幫助我們更好地完成這項(xiàng)任務(wù),在這篇文章中,我們將介紹如何使用 Python 的 logging 庫(kù)進(jìn)行日志記錄2023-06-06
Python常用數(shù)據(jù)庫(kù)接口sqlite3和MySQLdb學(xué)習(xí)指南
在本章節(jié)中,我們將學(xué)習(xí) Python 中常用的數(shù)據(jù)庫(kù)接口,包括 sqlite3用于SQLite數(shù)據(jù)庫(kù)和MySQLdb用于 MySQL 數(shù)據(jù)庫(kù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
手動(dòng)實(shí)現(xiàn)把python項(xiàng)目發(fā)布為exe可執(zhí)行程序過程分享
這篇文章主要介紹了手動(dòng)實(shí)現(xiàn)把python項(xiàng)目發(fā)布為exe可執(zhí)行程序過程分享,本文使用C語(yǔ)言實(shí)現(xiàn)了一個(gè)簡(jiǎn)潔的Python打包程序,需要的朋友可以參考下2014-10-10

