python中的heapq库

这篇具有很好参考价值的文章主要介绍了python中的heapq库。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.创建堆结构

这两天在学堆排序,手写建堆有两种方法。一种是从上到下从左到右,加一个数用一次heapInsert。时间复杂度是O(nlogn)。另一种方法是从下往上,从右往左,利用heapify进行调整,时间复杂度是O(n)。

而python库heapq中也有两种方法创建堆结构,本质和上述两者方法是一样的,一种用heapq.heappush(heap,arr[i]);另一种就是直接用heapq.heapify(arr)

python heapq,pyhon的相关操作,python,开发语言,numpy
两种实现的方法创建的小根堆可能不一样,但都满足堆结构的特定。
此外,heapq只能快速创建小根堆,如果要创建大根堆,可以把arr中的每个数取反,然后弹出的时候再取反,就能得到从大到小的数。

import heapq
arr = [10, 17, 50, 7, 30, 24, 27, 45, 15, 5, 36, 21]
nums = [-arr[i] for i in range(len(arr))]
# 方法一 用heappush()
heap = []
for i in range(len(arr)):
    heapq.heappush(heap, arr[i])
print("heappush", heap)

# 方法二 直接用heapq.heapify初始化
heapq.heapify(arr)
print("heapify", arr)

# 得到大根堆的效果 实际还是小根堆
print(nums)
heapq.heapify(nums)
big_to_small = [-heapq.heappop(nums) for _ in range(len(nums))]
print(big_to_small)

得到的结果如下:
python heapq,pyhon的相关操作,python,开发语言,numpy

2.使用堆结构进行堆排序(小到大 大到小)

其实在去相反数得到大根堆的时候代码中已经体现了该功能。用的函数就是heaq.heappop()。
python heapq,pyhon的相关操作,python,开发语言,numpy

3.获取前n个最大或最小值

用的函数是nsmallest(n,arr)和nlargest(n,arr)。

# 取前k个最大最小的数
print("nsmallest", heapq.nsmallest(3, arr))
print("nlargest", heapq.nlargest(2, arr))

python heapq,pyhon的相关操作,python,开发语言,numpy

4.合并两个有序列表

使用的是heapq.merage(arr1,arr2)

a = [3, 1, 6, 8]
b = [5, 9, 2, 1]
merge = heapq.merge(sorted(a), sorted(b))
# merge返回的结果是迭代器 所以要输出list(merge)
print(list(merge))
#[1, 1, 2, 3, 5, 6, 8, 9]

5.替换数据的方法

两种方法,一种是heapq.heappushpop(heap,num),这种方法是先把num值加入到堆中,再把堆顶的元素推出。另一种是**heapq.heapreplace(heap, num)**这种方法是先把堆顶的元素推出栈然后再把值加进来。

print(heap)
gen = heapq.heappushpop(heap, 3)
print("先把3加入堆再弹出的根,弹出值:", gen)
print("after heappushpop", heap)

gen2 = heapq.heapreplace(heap, 3)
print("先弹出根在把3加入到堆中,弹出值:", gen2)
print("after heapreplace", heap)

python heapq,pyhon的相关操作,python,开发语言,numpy文章来源地址https://www.toymoban.com/news/detail-657876.html

到了这里,关于python中的heapq库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python Numpy入门基础(二)数组操作

    NumPy是Python中一个重要的数学运算库,它提供了了一组多维数组对象和一组用于操作这些数组的函数。以下是一些NumPy的主要特点: 多维数组对象:NumPy的核心是ndarray对象,它是一个多维数组对象,可以容纳任意数据类型。 矢量化操作:使用NumPy的函数,可以对整个数组进行

    2024年02月15日
    浏览(44)
  • [开发语言][python][c++]:C++中的this指针和Python中的Self -- 26岁生日

    以朋友的新岁祝福开篇,祝笔者也祝大家☺️: 之前一直对 C++ 中的 this 和 python 中的 self 到底是什么关系,为什么 C++ 要显式的写出来,python 则不需要? 模糊不清,趁着周末整理一下相关结论,希望本篇文章可以解答这些问题,同时对C++和Python中的类加深些理解。 python 当

    2024年01月24日
    浏览(69)
  • Python数据结构堆(heapq)库使用

    一.heapq库简介 heapq 库是Python标准库之一,提供了构建小顶堆的方法和一些对小顶堆的基本操作方法(如入堆,出堆等),可以用于实现堆排序算法。 二.使用heapq创建堆 1、heappush(heap,n)数据堆入 运行结果: 2、heappop(heap)将数组堆中的最小元素弹出 运行结果: 3、heapify(heap) 将he

    2024年02月11日
    浏览(40)
  • Python - 优先队列(queue.PriorityQueue & heapq)

    目录 什么是优先队列 为什么需要优先队列? 优先队列是个啥? 优先队列的工作原理 Python实现一个优先队列 Python内置库中的queue.PriorityQueue的使用 基本操作 多条件优先级实现 Python内置库中的heapq heapq的常用操作 基于heapq实现一个优先队列类 为什么需要优先队列? 有一个小

    2024年02月08日
    浏览(34)
  • 【深度学习】 Python 和 NumPy 系列教程(十二):NumPy详解:4、数组广播;5、排序操作

    目录 一、前言 二、实验环境 三、NumPy 0、多维数组对象(ndarray) 多维数组的属性 1、创建数组 2、数组操作 3、数组数学 4、数组广播 5、排序操作 1. np.sort() 函数 2. np.argsort() 函数 3. ndarray.sort() 方法 4. 按列或行排序 5. np.lexsort() 函数 6. np.partition() 函数 7. np.argpartition() 函

    2024年02月08日
    浏览(63)
  • (Python)对numpy中的argmax用法的理解

    argmax()返回的就是最大数的索引 argmax()有一个参数axis,可以指定函数返回不同维的最大值。 结果是 4 。而在python中一维向量只有一个方向,所以一维情况下axis只能等于0,函数只会返回一个值。 如果对它进行转置,它就会变成一个二维矩阵: axis的值大于0 比如说 会报错 nu

    2023年04月24日
    浏览(43)
  • Python基础篇(十六)-- Python标准库模块之heapq与bisect

    1.1 介绍         堆是非线性的树形的数据结构,有2种堆,最大堆与最小堆。Python 的 heapq 模块默认的是最小堆。堆数据结构最重要的特征是 heap[0] 永远是最小的元素。 最大堆:树中父节点的值总是大于等于任意子节点的值 最小堆:树中父节点的值总是小于等于任意子节

    2023年04月08日
    浏览(34)
  • 数据科学中的Python:NumPy和Pandas入门指南【第121篇—NumPy和Pandas】

    数据科学是当今数字时代中的一个重要领域,而Python是数据科学家们最喜爱的编程语言之一。在这篇博客中,我们将介绍Python中两个强大的库——NumPy和Pandas,它们在数据处理和分析中发挥着重要作用。 NumPy是用于科学计算的基础包,提供了高性能的多维数组对象( numpy.nda

    2024年03月15日
    浏览(94)
  • 【Python 零基础入门】Numpy 常用函数 数组操作 & 数学运算

    Numpy (Numerical Python) 是 Python 编程语言的一个扩展程序库, 支持大量的维度数组与矩阵运算, 并提供了大量的数学函数库. Numpy 利用了多线程数组来存储和处理大型数据集, 从而提供了一个高效的方式来进行数值计算, 特别是对于矩阵预算和线性代数. np.assarray 可以将输入转换为

    2024年02月05日
    浏览(46)
  • [开发语言][c++][python]:C++与Python中的赋值、浅拷贝与深拷贝

    写在前面 :Python和C++中的赋值与深浅拷贝,由于其各自语言特性的问题,在概念和实现上稍微有点差异,本文将这C++和Python中的拷贝与赋值放到一起,希望通过对比学习两语言实现上的异同点,加深对概念的理解。 C++中所谓的 浅拷贝 就是由(系统默认的) 拷贝构造函数对

    2024年02月02日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包