Python中的模块heapq以及使用方法详解

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

python中的 heapq 模块

1、heapq 的两个函数:nlargest() 和 nsmallest()

1.1 nlargest(n, iterable, key=None) 函数

功能:获取可迭代对象iterable中n个最大的元素,返回这n个最大的元素列表(该列表从最大到小排列)

  • 示例代码1:
import heapq

arr_list = [5, 595, 2, 19, 5, 68, 4, 165, 46, 16]
print(heapq.nlargest(3, arr_list))

# 打印结果 [595, 165, 68]
# 
  • 示例代码2(参数key的用法):
"""
    key 的用法是,对于这种列表套字典的数据,根据字典的某个键,取出该数据的n个这个键的最大的n个数据
"""
import heapq

data_list = [
    {"name": "python", "price": 90},
    {"name": "java", "price": 34},
    {"name": "c", "price": 60},
    {"name": "html", "price": 70},
    {"name": "go", "price": 83}
]

price_max_3 = heapq.nlargest(3, data_list, key=lambda x: x['price'])
print(price_max_3)

# 打印结果 [{'name': 'python', 'price': 90}, {'name': 'go', 'price': 83}, {'name': 'html', 'price': 70}]

1.2 nsmallest(n, iterable, key=None) 函数

功能:获取可迭代对象iterable中n个最小的元素,返回这n个最小的元素列表(该列表从最小到大排列)

  • 示例代码1:
import heapq

arr_list = [5, 595, 2, 19, 5, 68, 4, 165, 46, 16]
print(heapq.nsmallest(3, arr_list))

# 打印结果 [2, 4, 5]
  • 示例代码2(参数key的用法):
"""
    key 的用法是,对于这种列表套字典的数据,根据字典的某个键,取出该数据的n个这个键的最小的n个数据
"""
import heapq

data_list = [
    {"name": "python", "price": 90},
    {"name": "java", "price": 34},
    {"name": "c", "price": 60},
    {"name": "html", "price": 70},
    {"name": "go", "price": 83}
]

# price_max_3 = heapq.nlargest(3, data_list, key=lambda x: x['price'])
price_min_3 = heapq.nsmallest(3, data_list, key=lambda x: x['price'])
print(price_min_3)

# 打印结果 [{'name': 'java', 'price': 34}, {'name': 'c', 'price': 60}, {'name': 'html', 'price': 70}]

2、heapq 的 heapify()函数

heapify() 函数将普通的列表转换为堆

heapify() 函数通过将普通列表转换为堆,使得我们可以使用堆中提供的一些高效的操作,
例如 heappush()、heappop()、heapreplace() 等函数,
这些函数能够在常数时间内插入元素、弹出最小元素、替换最小元素。
这使得堆成为一种非常高效的数据结构,在诸多算法中得以广泛应用。

heapify() 函数将普通的列表转换为堆的过程如下:
1、从列表的末尾开始,依次向前遍历所有元素。对于每个元素,将其与它的父节点进行比较。如果该元素比其父节点小(或大,如果是大根堆),则将它与其父节点交换。
2、继续向前遍历,对于每个元素,重复上述比较和交换过程,直至整个列表变成一个堆。
3、最终得到的堆中,第一个元素是堆中最小的元素(或最大的元素,如果是大根堆)。


大根堆和小根堆是堆(Heap)这种数据结构的两种常见实现方式。它们的区别如下:
    大根堆:在大根堆中,每个节点的值都大于等于其子节点的值,堆中最大的元素位于堆的根节点。
    小根堆:在小根堆中,每个节点的值都小于等于其子节点的值,堆中最小的元素位于堆的根节点。
在一般的堆排序算法中,都使用小根堆来实现堆。这是因为小根堆的根节点是堆中最小的元素,可以方便地弹出并加入一个序列,从而完成排序。当然,如果需要寻找序列中最大的元素,也可以使用大根堆实现。
  • 示例代码:
import heapq

arr_list = [5, 595, 2, 19, 5, 68, 4, 165, -20, 46, 16]
heapq.heapify(arr_list)  # 默认是转化为小根堆
print("默认的小根堆:", arr_list)
arr_list = [-x for x in arr_list]  # 取相反数,转换为大根堆
heapq.heapify(arr_list)  # 转换为大根堆
arr_list = [-x for x in arr_list]
print("取反后的大根堆:", arr_list)

# 打印结果
# 默认的小根堆: [-20, 5, 2, 19, 5, 68, 4, 165, 595, 46, 16]
# 取反后的大根堆: [595, 165, 68, 19, 46, 2, 4, 5, -20, 5, 16]

2、heapq 的 heappop()函数

将第一个元素(最小的)弹出,然后以第二小的元素取而代之,复杂度为O(logN), N代表堆的大小

import heapq

arr_list = [5, 595, 2, 19, 5, 68, 4, 165, -20, 46, 16]
heapq.heapify(arr_list)  # 默认是转化为小根堆
print(heapq.heappop(arr_list))  # -20
print(heapq.heappop(arr_list))  # 2
print(heapq.heappop(arr_list))  # 4
print(heapq.heappop(arr_list))  # 5

3. heapq 的 heappush()函数

heapq.heappush(heap, item)文章来源地址https://www.toymoban.com/news/detail-690159.html

用于将一个元素添加到一个堆中,并保持堆的不变性。
这个函数接受两个参数:
    heap:表示要添加元素的堆。堆可以是一个列表,也可以是一个支持类似于列表的接口的对象。
    item:要添加的元素。
heappush() 函数将要添加的元素插入堆中,并保持堆的不变性。插入的元素必须是可比较的对象,因为堆中的元素必须可以进行排序。默认情况下,heappush() 函数会按照元素的大小进行排序,因此通常要求元素是数字类型或实现了比较操作的自定义对象。
  • 示例代码:
import heapq

# 创建一个空堆
heap = []

# 添加一些元素到堆中
heapq.heappush(heap, 3)
heapq.heappush(heap, 1)
heapq.heappush(heap, 4)
heapq.heappush(heap, 1)

# 查看堆中的元素
print(heap)

# 打印结果
# [1, 1, 4, 3]
# 使用 heappush() 函数向一个空堆 heap 中添加了四个元素。
# 由于 heappush() 函数会按照元素的大小进行排序,因此添加的元素在堆中被自动排序了。
# 最后,我们打印出堆中的元素,结果为 [1, 1, 4, 3]。可以看到,堆中的元素已经按照升序排列,
# 并且包含了多个相同元素。

4. 使用 heapq 模块实现一个简单的优先级队列

import heapq


class PriorityQueue:
    """
        heapq 模块实现的简单的优先级队列
    """

    def __init__(self):
        self._queue = []
        self._index = 0

    def push(self, item, priority):
        # 把 priority 取负值是未来让队列能够按元素的优先级从高到低的顺序排列
        heapq.heappush(self._queue, (-priority, self._index, item))
        self._index += 1

    def pop(self):
        return heapq.heappop(self._queue)[-1]


class Item:

    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return "Item({!r})".format(self.name)


q = PriorityQueue()
# 往队列里面推数据
q.push(Item(name='python'), 5)  # 设置name为python,优先级为1
q.push(Item(name='java'), 1)  # 设置name为python,优先级为1
q.push(Item(name='c'), 1)  # 设置name为python,优先级为1
q.push(Item(name='vue'), 3)  # 设置name为python,优先级为1
q.push(Item(name='go'), 2)  # 设置name为python,优先级为1

# 从队列里面取出数据,按照设置的优先级,取出数据
print(q.pop())  # Item('python')
print(q.pop())  # Item('vue')
print(q.pop())  # Item('go')
print(q.pop())  # Item('java')

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

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

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

相关文章

  • git的常用命令以及在可视化工具中的使用方法

    想当初在刚进公司的时候,对于git的使用非常不熟悉,特别是分支的概念,导致开发效率变低,故通过此文章,总结git的使用经验 2.1 git clone [url]: 克隆远程仓库到本地 刚开始时,都需要将远程的代码拉到本地,这里一般是去对应的代码托管平台复制项目的链接,链接有ssh和

    2024年01月16日
    浏览(53)
  • Python random模块(获取随机数)常用方法和使用例子

    嗨喽,大家好呀~这里是爱看美女的茜茜呐 random.random random.random()用于生成一个0到1的随机符点数: 0 = n 1.0 random.uniform random.uniform(a, b),用于生成一个指定范围内的随机符点数,两个参数其中一个是上限,一个是下限。 如果a b,则生成的随机数n: a = n = b。如果 a b, 则 b = n = a

    2024年01月24日
    浏览(65)
  • Python3.6统计模块statsmodels的安装教程及使用方法

    Python3.6统计模块statsmodels的安装教程及使用方法 如果你需要对数据进行深入的统计分析和建模,那么Python编程语言中的statsmodels模块会是你的不二之选。该模块提供了多种统计模型、工具和功能,用于进行统计建模、推断、预测以及数据探索。本文将为大家详细介绍Python3.6下

    2024年02月11日
    浏览(39)
  • chatgpt赋能python:Python中的矩阵合并方法:介绍和使用方法

    矩阵合并是Python编程中常用的操作之一,特别是针对数据分析、机器学习和深度学习等领域。Python提供了多种方法来合并矩阵,本文将介绍这些方法并分享如何在实际应用中使用它们。 最基础的矩阵合并方法是使用numpy库的concatenate方法。这个方法接受两个或多个矩阵作为参

    2024年02月14日
    浏览(59)
  • 详解Python中的split()函数的使用方法

    函数:split() Python中有split()和os.path.split()两个函数,具体作用如下: split():拆分字符串。通过指定分隔符对字符串进行切片,并返回分割后的字符串列表(list) os.path.split():按照路径将文件名和路径分割开 一、函数说明 1、split()函数 语法:str.split(str=\\\"\\\",num=string.count(str))

    2024年02月07日
    浏览(46)
  • python中的lstm:介绍和基本使用方法

    python中的lstm:介绍和基本使用方法 未使用插件 LSTM(Long Short-Term Memory)是一种循环神经网络(RNN)的变体,专门用于处理序列数据。LSTM 可以记忆序列中的长期依赖关系,这使得它非常适合于各种自然语言处理(NLP)和时间序列预测任务。 在 Python 中,你可以使用深度学习框

    2024年02月12日
    浏览(41)
  • python中的cnn:介绍和基本使用方法

    python中的cnn:介绍和基本使用方法 卷积神经网络(Convolutional Neural Networks,简称CNN)是一种在图像识别、语音识别、自然语言处理等许多领域取得显著成功的深度学习模型。CNN的设计灵感来源于生物的视觉系统,由多个卷积层、池化层和全连接层组成。 在Python中,我们通常使

    2024年02月12日
    浏览(41)
  • python中的svm:介绍和基本使用方法

    python中的svm:介绍和基本使用方法 支持向量机(Support Vector Machine,简称SVM)是一种常用的分类算法,可以用于解决分类和回归问题。SVM通过构建一个超平面,将不同类别的数据分隔开,使得正负样本之间的间隔(也称为边缘)最大化。 在Python中,可以使用scikit-learn库来使用

    2024年02月12日
    浏览(44)
  • Python中的海象运算符“:=”使用方法详解

    海象运算符(walrus operator)是 Python 3.8 中引入的一种新的语法,其使用方法如下:         其中,expression 是一个任意的表达式,而 variable 则是一个变量名。该运算符允许将表达式的结果赋值给变量,并且在同一行中进行这两个操作。         在某些情况下,使用海象

    2024年02月05日
    浏览(42)
  • chatgpt赋能python:python中的iloc:介绍和基本使用方法

    在Python中,Dataframe是数据分析中最常用的数据结构。iloc是Python Pandas库中用于简化数据切片和子集操作的一种方法。 本文将介绍iloc的基础概念和基本使用方法,并且通过实际的示例来演示如何使用iloc来快速选择和操作数据集。 iloc是“integer location”的缩写,意为“整数位置

    2024年02月04日
    浏览(54)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包