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 21 Python
python原始套接字编程示例分享
Feb 21 Python
Python探索之实现一个简单的HTTP服务器
Oct 28 Python
全面了解Nginx, WSGI, Flask之间的关系
Jan 09 Python
django自带的server 让外网主机访问方法
May 14 Python
python读取一个目录下所有txt里面的内容方法
Jun 23 Python
Django+JS 实现点击头像即可更改头像的方法示例
Dec 26 Python
利用python在excel里面直接使用sql函数的方法
Feb 08 Python
对python 树状嵌套结构的实现思路详解
Aug 09 Python
python数据持久存储 pickle模块的基本使用方法解析
Aug 30 Python
用python对excel查重
Dec 07 Python
Python基于爬虫实现全网搜索并下载音乐
Feb 14 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实现的博客欢迎提示功能(很特别哦)
2014/06/05 PHP
采用memcache在web集群中实现session的同步会话
2014/07/05 PHP
CodeIgniter与PHP5.6的兼容问题
2015/07/16 PHP
PHP中的函数声明与使用详解
2017/05/27 PHP
JS实多级联动下拉菜单类,简单实现省市区联动菜单!
2007/05/03 Javascript
取键盘键位ASCII码的网页
2007/07/30 Javascript
与jquery serializeArray()一起使用的函数,主要来方便提交表单
2011/01/31 Javascript
在线所见即所得HTML编辑器的实现原理浅析
2015/04/25 Javascript
jquery插件splitScren实现页面分屏切换模板特效
2015/06/16 Javascript
JS动态日期时间的获取方法
2015/09/28 Javascript
jQuery Validate插件实现表单强大的验证功能
2015/12/18 Javascript
浅析location.href跨窗口调用函数
2016/11/22 Javascript
vue中实现methods一个方法调用另外一个方法
2018/02/08 Javascript
使用 vue-i18n 切换中英文效果
2018/05/23 Javascript
Vue 获取数组键名的方法
2018/06/21 Javascript
JS原生瀑布流效果实现
2019/04/26 Javascript
简单学习5种处理Vue.js异常的方法
2019/06/17 Javascript
JS页面获取 session 值,作用域和闭包学习笔记
2019/10/16 Javascript
Angular之jwt令牌身份验证的实现
2020/02/14 Javascript
如何在postman中添加cookie信息步骤解析
2020/06/30 Javascript
Django+uni-app实现数据通信中的请求跨域的示例代码
2019/10/12 Python
使用Tensorflow将自己的数据分割成batch训练实例
2020/01/20 Python
Python 时间戳之获取整点凌晨时间戳的操作方法
2020/01/28 Python
python实现处理mysql结果输出方式
2020/04/09 Python
windows python3安装Jupyter Notebooks教程
2020/04/13 Python
python连接mongodb数据库操作数据示例
2020/11/30 Python
简述Html5 IphoneX 适配方法
2018/02/08 HTML / CSS
台湾前三大B2C购物网站:MOMO购物网
2017/04/27 全球购物
高中的自我鉴定
2013/12/16 职场文书
违反工作纪律检讨书
2014/02/15 职场文书
办公室文员岗位职责范本
2014/06/12 职场文书
建筑工地宣传标语
2014/06/18 职场文书
党员志愿者活动总结
2014/06/26 职场文书
2015年乡镇人大工作总结
2015/04/22 职场文书
《秦兵马俑》教学反思
2016/02/24 职场文书
python实现简易自习室座位预约系统
2021/06/30 Python