Python cookbook(数据结构与算法)实现优先级队列的方法示例


Posted in Python onFebruary 18, 2018

本文实例讲述了Python实现优先级队列的方法。分享给大家供大家参考,具体如下:

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

解决方案:采用heapq模块实现一个简单的优先级队列

# example.py
#
# Example of a priority queue
import 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]
# Example use
class Item:
  def __init__(self, name):
    self.name = name
  def __repr__(self):
    return 'Item({!r})'.format(self.name)
q = PriorityQueue()
q.push(Item('foo'), 1)
q.push(Item('bar'), 5)
q.push(Item('spam'), 4)
q.push(Item('grok'), 1)
print("Should be bar:", q.pop())
print("Should be spam:", q.pop())
print("Should be foo:", q.pop())
print("Should be grok:", q.pop())
Python 3.4.0 (v3.4.0:04f714765c13, Mar 16 2014, 19:24:06) [MSC v.1600 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>> 
Should be bar: Item('bar')
Should be spam: Item('spam')
Should be foo: Item('foo')
Should be grok: Item('grok')
>>>

可以看出:第一次执行pop()操作时返回的元素具有最高的优先级;对于相同优先级的两个元素(foo和gork)返回的顺序同它们插入到队列时的顺序相同。

在这段代码中,队列以元组(-priority, self._index, item)的形式组成,priority取负值是为了队列按照从高到低的顺序排列,这和堆默认的从小到大的排序相反。

变量index的作用是对相同优先级的元素以适当的顺序排列,特别对同优先级的元素间做比较操作时扮演了重要的角色。

Item实例无法进行次序比较:

a=Item('foo')
b=Item('bar')
print('a<b: ',a<b)
>>> 
Traceback (most recent call last):
 File "D:\4autotests\02script\python-cookbook\python-cookbook-master\src\1\5.implementing_a_priority_queue\example.py", line 27, in <module>
  print('a<b: ',a<b)
TypeError: unorderable types: Item() < Item()
>>>

如果以元组(priority,  item)的形式来表示元素,只要优先级不同,就可进行比较:

a=(1,Item('foo'))
b=(5,Item('bar'))
c=(1,Item('gork'))
print('a<b: ',a<b)
print('a<c: ',a<c)
>>> 
a<b: True
Traceback (most recent call last):
 File "D:\4autotests\02script\python-cookbook\python-cookbook-master\src\1\5.implementing_a_priority_queue\example.py", line 29, in <module>
  print('a<c: ',a<c)
TypeError: unorderable types: Item() < Item()
>>>

引入额外的索引值,以(priority, index, item)的方式建立元组,就可以避免相同优先级无法比较的问题,因为没有哪两个元组会有相同的index值;

a=(1,0,Item('foo'))
b=(5,1,Item('bar'))
c=(1,2,Item('gork'))
print('a<b: ',a<b)
print('a<c: ',a<c)
>>> 
a<b: True
a<c: True
>>>

如果想将这个队列用于线程间通信,还需要增加适当的锁和信号机制。

(代码摘自《Python Cookbook》)

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python的Flask框架标配模板引擎Jinja2的使用教程
Jul 12 Python
django静态文件加载的方法
May 20 Python
python3 打开外部程序及关闭的示例
Nov 06 Python
Python创建一个空的dataframe,并循环赋值的方法
Nov 08 Python
Django学习笔记之为Model添加Action
Apr 30 Python
python将三维数组展开成二维数组的实现
Nov 30 Python
Pytorch 之修改Tensor部分值方式
Dec 27 Python
Python解释器以及PyCharm的安装教程图文详解
Feb 26 Python
Keras框架中的epoch、bacth、batch size、iteration使用介绍
Jun 10 Python
python单元测试框架pytest的使用示例
Oct 07 Python
Python pygame实现中国象棋单机版源码
Jun 20 Python
全网非常详细的pytest配置文件
Jul 15 Python
python快速建立超简单的web服务器的实现方法
Feb 17 #Python
Python cookbook(数据结构与算法)找到最大或最小的N个元素实现方法示例
Feb 13 #Python
python3学习笔记之多进程分布式小例子
Feb 13 #Python
Python cookbook(数据结构与算法)保存最后N个元素的方法
Feb 13 #Python
Python cookbook(数据结构与算法)从任意长度的可迭代对象中分解元素操作示例
Feb 13 #Python
Python cookbook(数据结构与算法)将序列分解为单独变量的方法
Feb 13 #Python
Python内置模块ConfigParser实现配置读写功能的方法
Feb 12 #Python
You might like
简单的方法让你的后台登录更加安全(php中加session验证)
2012/08/22 PHP
PHP 中关于ord($str)&amp;gt;0x80的详细说明
2012/09/23 PHP
php与java通过socket通信的实现代码
2013/10/21 PHP
thinkPHP中分页用法实例分析
2015/12/26 PHP
Js动态创建div
2008/09/25 Javascript
setTimeout和setInterval的区别你真的了解吗?
2011/03/31 Javascript
通过jquery的$.getJSON做一个跨域ajax请求试验
2011/05/03 Javascript
JS实现点击图片在当前页面放大并可关闭的漂亮效果
2013/10/18 Javascript
jquery插件开发之实现google+圈子选择功能
2014/03/10 Javascript
使用jQuery异步加载 JavaScript脚本解决方案
2014/04/20 Javascript
node.js中的path.dirname方法使用说明
2014/12/09 Javascript
浅谈javascript中for in 和 for each in的区别
2015/04/23 Javascript
实例讲解Jquery中隐藏hide、显示show、切换toggle的用法
2016/05/13 Javascript
JavaScript获取ul中li个数的方法
2017/02/13 Javascript
jquery实现自适应banner焦点图
2017/02/16 Javascript
webpack构建react多页面应用详解
2017/09/15 Javascript
Vue导出json数据到Excel电子表格的示例
2017/12/04 Javascript
详解Vue文档中几个易忽视部分的剖析
2018/03/24 Javascript
微信小程序修改checkbox的样式代码实例
2020/01/21 Javascript
《javascript设计模式》学习笔记三:Javascript面向对象程序设计单例模式原理与实现方法分析
2020/04/07 Javascript
django通过ajax发起请求返回JSON格式数据的方法
2015/06/04 Python
详解Django中Request对象的相关用法
2015/07/17 Python
python中requests爬去网页内容出现乱码问题解决方法介绍
2017/10/25 Python
PyQt5主窗口动态加载Widget实例代码
2018/02/07 Python
Python实现html转换为pdf报告(生成pdf报告)功能示例
2019/05/04 Python
python之生成多层json结构的实现
2020/02/27 Python
jupyter修改文件名方式(TensorFlow)
2020/04/21 Python
深入理解css属性的选择对动画性能的影响
2016/04/20 HTML / CSS
HTML5 Canvas图像模糊完美解决办法
2018/02/06 HTML / CSS
廉价航班、机票和酒店:JustFly
2018/02/07 全球购物
印尼综合在线预订网站:Tiket.com(机票、酒店、火车、租车和娱乐)
2018/10/11 全球购物
Math.round(11.5)等於多少? Math.round(-11.5)等於多少?
2015/01/27 面试题
讲文明知礼仪演讲稿
2014/09/13 职场文书
技术股东合作协议书
2014/12/02 职场文书
学校国庆节活动总结
2015/03/23 职场文书
windows11怎么查看wifi密码? win11查看wifi密码的技巧
2021/11/21 数码科技