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.mzph.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;路径下的可执…