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 默认参数问题的陷阱
Feb 29 Python
Python连接SQLServer2000的方法详解
Apr 19 Python
python中解析json格式文件的方法示例
May 03 Python
Python爬虫实现全国失信被执行人名单查询功能示例
May 03 Python
使用pycharm生成代码模板的实例
May 23 Python
Python面向对象之继承和组合用法实例分析
Aug 27 Python
Pycharm中安装wordcloud等库失败问题及终端通过pip安装的Python库如何添加到Pycharm解释器中(推荐)
May 10 Python
keras实现调用自己训练的模型,并去掉全连接层
Jun 09 Python
MATLAB数学建模之画图汇总
Jul 16 Python
协程Python 中实现多任务耗资源最小的方式
Oct 19 Python
详解Selenium-webdriver绕开反爬虫机制的4种方法
Oct 28 Python
python 如何在 Matplotlib 中绘制垂直线
Apr 02 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中const与define的应用区别
2013/06/18 PHP
将word转化为swf 如同百度文库般阅读实现思路及代码
2013/08/09 PHP
PHP数据过滤的方法
2013/10/30 PHP
php建立Ftp连接的方法
2015/03/07 PHP
php strftime函数获取日期时间(switch用法)
2018/05/16 PHP
javascript 关于# 和 void的区别分析
2009/10/26 Javascript
基于jQuery的360图片展示实现代码
2012/06/14 Javascript
js关闭父窗口时关闭子窗口
2013/04/01 Javascript
js实现类似新浪微博首页内容渐显效果的方法
2015/04/10 Javascript
javascript简单实现滑动菜单效果的方法
2015/07/27 Javascript
js获取表格的行数和列数的方法
2015/10/23 Javascript
jQuery中借助deferred来请求及判断AJAX加载的实例讲解
2016/05/24 Javascript
javascript基础练习之翻转字符串与回文
2017/02/20 Javascript
Vue.js实现在下拉列表区域外点击即可关闭下拉列表的功能(自定义下拉列表)
2017/05/30 Javascript
关于jQuery里prev()的简单操作代码
2017/10/27 jQuery
Vue中qs插件的使用详解
2020/02/07 Javascript
使用Node.js实现base64和png文件相互转换的方法
2020/03/11 Javascript
[03:13]DOTA2-DPC中国联赛1月25日Recap集锦
2021/03/11 DOTA
[01:00:14]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第二场 2月28日
2021/03/11 DOTA
Python面向对象编程中关于类和方法的学习笔记
2016/06/30 Python
python 从csv读数据到mysql的实例
2018/06/21 Python
pytorch-RNN进行回归曲线预测方式
2020/01/14 Python
python关于变量名的基础知识点
2020/03/03 Python
python 获取当前目录下的文件目录和文件名实例代码详解
2020/03/10 Python
django 链接多个数据库 并使用原生sql实现
2020/03/28 Python
python实现俄罗斯方块小游戏
2020/04/24 Python
python字典通过值反查键的实现(简洁写法)
2020/09/30 Python
利用css3如何设置没有上下边的列表间隔线
2017/07/03 HTML / CSS
详解如何使用CSS3中的结构伪类选择器和伪元素选择器
2020/01/06 HTML / CSS
领导干部廉政承诺书
2014/03/27 职场文书
家长建议怎么写
2014/05/15 职场文书
一百条裙子读书笔记
2015/07/01 职场文书
2019年最新证婚词精选集!
2019/06/28 职场文书
浅谈mysql增加索引不生效的几种情况
2021/06/23 MySQL
上个世纪50年代的可穿戴技术:无线电帽子
2022/02/18 无线电
git中cherry-pick命令的使用教程
2022/06/25 Servers