Python中的heapq模塊

Python中的heapq模塊

文章目錄

    • Python中的heapq模塊
      • 1.heapq的方法
      • 2.使用heapq創建堆
      • 3.使用heapq實現堆排序
      • 4.獲取堆中的前n個最大值或最小值
      • Reference

heapq模塊實現了堆隊列的算法,即優先隊列算法。heapq其實是實現了一種小頂堆,所以使用pop()方法返回的是當前堆中的最小元素。

1.heapq的方法

方法功能
heapq.heappush(heap, item)item的值加入到heap中,保持堆的不變性
heapq.heappop(heap)彈出并返回heap中的最小值,保持堆的不變性。
heapq.heappushpop(heap, item)item放入堆中,然后彈出并返回heap中的最小元素,這個操作比先調用heappush()再調用heappop()效率更高。
heapq.heapify(x)list x轉換成堆
heapq.heapreplace(heap, item)彈出并返回 heap 中最小的一項,同時推入新的 item
heapq.nlargest(n, iterable, key=None)iterable 所定義的數據集中返回前 n 個最大元素組成的列表。
heapq.nlargest(n, iterable, key=None)iterable 所定義的數據集中返回前 n 個最小元素組成的列表。
heapq.merge(*iterables, key=None, reverse=False)將多個已排序的輸入合并為一個已排序的輸出

2.使用heapq創建堆

有兩種方法可以用于創建堆,第一種是直接使用方法heapq.heapify(iterable),直接將可迭代的對象轉換成小頂堆。第二種方法是使用heapq.push(heap, item)將元素手動放入指定的heap中。

import heapq
array = [5, 7, 9, 0, 3, 2, 1, 6, 4, 8]
# 1.使用heapq.push來創建
heap = []
for num in array:heapq.heappush(heap, num)
print('array:', array)
print('heap:', heap)
# 2.使用heapify來創建
heapq.heapify(array)    
print('array:', array)
array: [5, 7, 9, 0, 3, 2, 1, 6, 4, 8]
heap: [0, 3, 1, 4, 5, 9, 2, 7, 6, 8]
array: [0, 3, 1, 4, 5, 2, 9, 6, 7, 8]

特別注意的是,堆元素可以為元組,這有利于以下做法——在被跟蹤的主記錄旁邊添一個額外的值(例如任務的優先級)用于互相比較,我們只需要將排序的值放在元組的第一個位置即可:

import heapq
heap = []
heapq.heappush(heap, (5, 'Alex'))
heapq.heappush(heap, (2, 'Ben'))
heapq.heappush(heap, (0, 'David'))
heapq.heappush(heap, (1, 'Elon'))
print('heap:', heap)
heapq.heappop(heap)
print('heap:', heap)
heap: [(0, 'David'), (1, 'Elon'), (2, 'Ben'), (5, 'Alex')]
heap: [(1, 'Elon'), (5, 'Alex'), (2, 'Ben')]

這里我們按照tuple中第一元素,即這個數字來進行比較,構成堆,我們彈出的最小的元素是值為0的David。

import heapq
heap = []
heapq.heappush(heap, ('Alex', 5))
heapq.heappush(heap, ('Ben', 2))
heapq.heappush(heap, ('David', 0))
heapq.heappush(heap, ('Elon', 1))
print('heap:', heap)
heapq.heappop(heap)
print('heap:', heap)
heap: [('Alex', 5), ('Ben', 2), ('David', 0), ('Elon', 1)]
heap: [('Ben', 2), ('Elon', 1), ('David', 0)]

如果我們反過來使用名字來排序,構成堆,我們彈出的最小元素是ASCII碼最小的A即Alex。

3.使用heapq實現堆排序

我們可以將待排序的數據構建成一個小頂堆,每次從堆頂彈出數據,收集彈出的數據,這樣我們就可以獲得一個排完序的序列。

import heapq
array = [5, 7, 9, 0, 3, 2, 1, 6, 4, 8]
heapq.heapify(array)
res = [heapq.heappop(array) for _ in range(len(array))]
print('heap sort result:', res)
heap sort result: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

4.獲取堆中的前n個最大值或最小值

import heapq
array = [5, 7, 9, 0, 3, 2, 1, 6, 4, 8]
print('3 largest value:',heapq.nlargest(3, array))
print('3 smallest value:',heapq.nsmallest(3, array))
3 largest value: [9, 8, 7]
3 smallest value: [0, 1, 2]

Reference

heapq官方文檔
Python heapq庫的用法介紹

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/712881.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/712881.shtml
英文地址,請注明出處:http://en.pswp.cn/news/712881.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何進行弱網測試?

🍅 視頻學習:文末有免費的配套視頻可觀看 🍅 點擊文末小卡片,免費獲取軟件測試全套資料,資料在手,漲薪更快 如今這個高度互聯的時代里,網絡環境對于應用程序的影響越來越重要。 而弱網測試就是…

leetcode--接雨水(雙指針法,動態規劃,單調棧)

目錄 方法一:雙指針法 方法二:動態規劃 方法三:單調棧 42. 接雨水 - 力扣(LeetCode) 黑色的是柱子,藍色的是雨水,我們先來觀察一下雨水的分布情況: 雨水落在凹槽之間,在一個凹槽的…

使用js寫一個登錄驗證碼效果

面試題 登錄頁面獲取驗證碼的功能,用戶點擊獲取驗證碼按鈕(id”btn1”),按文字變為“(N)后獲取驗證碼”,N為倒計對秒數,從 60 開始,每秒減一,減到 0的時候,按鈕文字變為“獲取驗證碼”&#xff…

Beans模塊之工廠模塊Aware

博主介紹:?全網粉絲5W+,全棧開發工程師,從事多年軟件開發,在大廠呆過。持有軟件中級、六級等證書。可提供微服務項目搭建與畢業項目實戰,博主也曾寫過優秀論文,查重率極低,在這方面有豐富的經驗? 博主作品:《Java項目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+…

【JavaWeb】

Javaweb 數據庫相關概念MySQL數據庫MySQL數據模型SQLDDL--操作數據庫圖形化客戶端工具DML--操作數據DQL數據庫約束 數據庫設計多表查詢事務 數據庫相關概念 數據庫 存儲數據的倉庫,數據是有組織的進行存儲 英文:DataBase,簡稱DB 數據庫管理系…

單元測試數據庫回滾問題

問題現象: 在進行單元測試時,測試執行成功,可是數據庫中的數據沒變 問題解決:單元測試自動回滾,需要加上注解Rollback(false) https://zhhll.icu/2020/javaweb/問題/1.單元測試數據問題/ 本文由 mdnice 多平臺發布

機器學習-3

文章目錄 前言訓練驗證測試評估評估方法交叉驗證法自助法評估指標 練習題 前言 本篇介紹機器學習中的訓練、驗證、測試與評估的相關概念。 訓練 從數據中學得模型的過程稱為“學習”(learning)或“訓練”(training),這個過程通過執行某個學習算法來完成.訓練過程中使用的數據…

Android T 遠程動畫顯示流程其三——桌面側動畫啟動到系統側結束流程

前言 接著前文分析Android T 遠程動畫顯示流程其二 我們通過IRemoteAnimationRunner跨進程通信從系統進程來到了桌面進程,這里是真正動畫播放的邏輯。 之后又通過IRemoteAnimationFinishedCallback跨進程通信回到系統進程,處理動畫結束時的邏輯。 進入…

使用maven項目引入jQuery

最近在自學 springBoot ,期間準備搞一個前后端不分離的東西,于是需要在 maven 中引入jQuery 依賴,網上百度了很多,這里來做一個總結。 1、pom.xml 導入依賴 打開我們項目的 pom.xml 文件,輸入以下坐標。這里我使用的是…

FPGA-學會使用vivado中的存儲器資源ROM(IP核)

問題: 某芯片,有500個寄存器,需要在上電的時候由FPGA向這些寄存器中寫入初始值,初始值已經通過相應的文檔給出了具體值,這些值都是已知的。 分析關鍵點: 數據量比較多(Verilog代碼,通過case語句、always語句這種查找表的方式,數…

Linux——匿名管道

Linux——匿名管道 什么是管道匿名管道的底層原理觀察匿名管道現象讀寫端的幾種情況寫端慢,讀端快寫端快,讀端慢 管道的大小寫端關閉,讀端一直讀寫端一直寫,讀端關閉 我們之前一直用的是vim來編寫代碼,現在有了vscode這…

bert 相似度任務訓練,簡單版本

目錄 任務 代碼 train.py predit.py 數據 任務 使用 bert-base-chinese 訓練相似度任務,參考:微調BERT模型實現相似性判斷 - 知乎 參考他上面代碼,他使用的是 BertForNextSentencePrediction 模型,BertForNextSentencePred…

thinkphp學習10-數據庫的修改刪除

數據修改 使用 update()方法來修改數據,修改成功返回影響行數,沒有修改返回 0 public function index(){$data [username > 孫悟空1,];return Db::name(user)->where(id,11)->update($data);}如果修改數據包含了主鍵信息,比如 i…

STM32標準庫開發——BKP備份RTC時鐘

備份寄存器BKP(Backup Registers) 由于RTC與BKP關聯性較高,所以RTC的時鐘校準寄存器以及一些功能都放在了BKP中。TAMPER引腳主要用于防止芯片數據泄露,可以設計一個機關當TAMPER引腳發生電平跳變時自動清除寄存器內數據不同芯片BKP區別,主要體…

c++入門(2)

上期我們說到了部分c修補C語言的不足,今天我們將剩下的一一說清楚。 函數重載 (1).函數重載的形式 C語言不允許函數名相同的同時存在,但是C允許同名函數存在,但是有要求:函數名相同,參數不同,構成函數重…

【數據結構-圖論】并查集

并查集(Union-Find)是一種數據結構,它提供了處理一些不交集的合并及查詢問題的高效方法。并查集主要支持兩種操作: 查找(Find):確定某個元素屬于哪個子集,這通常意味著找到該子集的…

vue購物車實戰

1.引入vue <script src"https://cdn.jsdelivr.net/npm/vue2.7.14/dist/vue.js"></script> 2.設置高亮部分的樣式 <style> table tr{text-align: center;}.skyblue{background-color: skyblue;}</style> 3.設置body的基本樣式 <div id&q…

人大金倉與mysql的差異與替換

人大金倉中不能使用~下面的符號&#xff0c;字段中使用”&#xff0c;無法識別建表語句 創建表時語句中只定義字段名.字段類型.是否是否為空 Varchar類型改為varchar&#xff08;長度 char&#xff09; Int(0) 類型為int4 定義主鍵&#xff1a;CONSTRAINT 鍵名 主鍵類型&#x…

Found option without preceding group in config file 問題解決

方法就是用記事本打開 然后 左上角點擊 文件 有另存為 就可以選擇編碼格式

Linux設置程序任意位置執行(設置環境變量)

問題 直接編譯出來的可執行程序在執行時需要寫出完整路徑比較麻煩&#xff0c;設置環境變量可以實現在任意位置直接運行。 解決 1.打開.bashrc文件 vim ~/.bashrc 2.修改該文件&#xff08;實現將/home/zhangziheng/file/seqrequester/build/bin&#xff0c;路徑下的可執…