python如何实现优先级队列(附代码)

本篇文章给大家带来的内容是关于python如何实现优先级队列(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

1、需求

我们想要实现一个队列,它能够以给定的优先级来对元素排序,且每次pop操作时都会返回优先级最高的那个元素

2、解决方案

利用heapq模块实现

代码:

import heapq#利用heapq实现一个简答的优先级队列class PriorityQueue:    def __init__(self):        self._queue=[]        self._index=0    def push(self,item,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)if __name__ == '__main__':    q=PriorityQueue()    q.push(Item('foo'),1)    q.push(Item('bar'),5)    q.push(Item('spam'),4)    q.push(Item('grok'),1)    print(q.pop())    print(q.pop())    #具有相同优先级的两个元素,返回的顺序同它们插入到队列时的顺序相同    print(q.pop())    print(q.pop())

登录后复制

运行结果:

Item('bar')Item('spam')Item('foo')Item('grok')

登录后复制上面的代码核心在于heapq模块的使用。函数heapq.heapqpush()以及heapq.heapqpop()分别实现将元素从列表_queue中插入和移除,且保证列表中第一个元素的优先级最低。heappop()方法总是返回【最小】的元素,因此这就是让队列能弹出正确元素的关键。此外,由于push和pop操作的复杂度都是O(logN),其中N代表堆中元素的数量,因此就算N的值很大,这些操作的效率也非常高。

上面代码中,队列以元组(-priority ,index,item)的形式组成。把priority取负值是为了让队列能够按照元素的优先级从高到底的顺序排列。

立即学习“Python免费学习笔记(深入)”;

变量index的作用是为了将具有相同优先级的元素以适当的顺序排列。通过维护一个不断递增的索引,元素将以它们如队列时的顺序来排列。为了说明index的作用,看下面实例:

代码:

class Item:    def __init__(self,name):        self.name=name    def __repr__(self):        return 'Item({!r})'.format(self.name)if __name__ == '__main__':    a=(1,Item('foo'))    b=(5,Item('bar'))    #下面一句打印True    print(a<b)    c=(1,Item('grok'))    #下面一句会报错:TypeError: '<' not supported between instances of 'Item' and 'Item'    print(c<a)    d=(1,0,Item('foo'))    e=(5,1,Item('bar'))    f=(1,2,Item('grok'))    #下面一句打印True    print(d<e)    #下面一句打印True    print(d<f)

登录后复制

以上就是python如何实现优先级队列(附代码)的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2260603.html

(0)
上一篇 2025年2月27日 05:44:08
下一篇 2025年2月19日 05:55:01

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • python实现一键多值字典的方法实现

    本篇文章给大家带来的内容是关于python实现一键多值字典的方法实现,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 1、需求 我们想要一个能将键(key)映射到多个值的字(即所谓的一键多值字典) 2、解决方案 字典是一种关…

    编程技术 2025年2月27日
    200
  • python如何让字典保持有序(代码)

    本篇文章给大家带来的内容是关于python如何让字典保持有序(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 1、需求 我们想创建一个字典,同时当对字典做迭代或序列化操作时,也能控制其中元素的顺序。 2、解决方案 要…

    编程技术 2025年2月27日
    200
  • Python如何实现字典上对数据执行计算

    本篇文章给大家带来的内容是关于Python如何实现字典上对数据执行计算,例如:最大值、最小值、排序等,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 1、需求 我们想在字典上对数据执行各式各样的计算,例如:最大值、最小值、排…

    编程技术 2025年2月27日
    200
  • python实现在两个字典中寻找相同点的方法(附代码)

    本篇文章给大家带来的内容是关于python实现在两个字典中寻找相同点的方法(附代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 1、需求 现在有两个字典,我们想找出它们中间可能相同的地方(相同的键、相同的值) 2、解决…

    编程技术 2025年2月27日
    200
  • python中Tornado的同步与异步I/O的介绍(附示例)

    本篇文章给大家带来的内容是关于python中tornado的同步与异步i/o的介绍(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 协程是Tornado种推荐的编程方式,使用协程可以开发出简捷、高效的异步处理代码。…

    编程技术 2025年2月27日
    200
  • Python中property函数的简单介绍

    本篇文章给大家带来的内容是关于python中property函数的简单介绍 ,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 Python中使用Property函数可以将类中的函数当作属性来调用。 案例 __metaclas…

    2025年2月27日
    200
  • python中预处理以及热图的简单介绍

    本篇文章给大家带来的内容是关于python中预处理以及热图的简单介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 在数据分析当中的东西还是很多的,我在这里只是启发式的介绍一下,了解到这方面的东西之后,使用的时候可以更快的…

    2025年2月27日
    200
  • Python中matplotlib模块用例(代码)

    本篇文章给大家带来的内容是关于python中matplotlib模块用例(代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 import matplotlib.pyplot as pltimport numpy as …

    2025年2月27日
    200
  • python的安装方法以及IO编程的简单介绍

    本篇文章给大家带来的内容是关于python的安装方法以及io编程的简单介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 一.python安装 1.python IDLE 下载官网:www.python.org 注:在选择…

    2025年2月27日
    200
  • Python中json模块和pickle模块的简单介绍(附示例)

    本篇文章给大家带来的内容是关于python中json模块和pickle模块的简单介绍(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 Python中的json模块和pickle都是用于数据的序列化和反序列化,它们提…

    编程技术 2025年2月27日
    200

发表回复

登录后才能评论