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解析中国天气网的天气数据
Mar 21 Python
Python中的with...as用法介绍
May 28 Python
Python数据类型学习笔记
Jan 13 Python
Python 正则表达式入门(初级篇)
Dec 07 Python
python初学之用户登录的实现过程(实例讲解)
Dec 23 Python
python监控文件并且发送告警邮件
Jun 21 Python
使用Python实现在Windows下安装Django
Oct 17 Python
Python多线程原理与用法实例剖析
Jan 22 Python
python算法与数据结构之单链表的实现代码
Jun 27 Python
python 的 scapy库,实现网卡收发包的例子
Jul 23 Python
100行Python代码实现每天不同时间段定时给女友发消息
Sep 27 Python
python 爬虫之selenium可视化爬虫的实现
Dec 04 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
asp和php下textarea提交大量数据发生丢失的解决方法
2008/01/20 PHP
thinkPHP框架可添加js事件的分页类customPage.class.php完整实例
2017/03/16 PHP
PHP实现从上往下打印二叉树的方法
2018/01/18 PHP
走出JavaScript初学困境—js初学
2008/12/29 Javascript
JS Excel读取和写入操作(模板操作)实现代码
2010/04/11 Javascript
理解javascript中DOM事件
2015/12/25 Javascript
微信小程序 实战小程序实例
2016/10/08 Javascript
JS IOS/iPhone的Safari浏览器不兼容Javascript中的Date()问题如何解决
2016/11/11 Javascript
EditPlus中的正则表达式 实战(2)
2016/12/15 Javascript
JS 在数组指定位置插入/删除数据的方法
2017/01/12 Javascript
JS实现的计数排序与基数排序算法示例
2017/12/04 Javascript
高性能的javascript之加载顺序与执行原理篇
2018/01/14 Javascript
解决修复npm安装全局模块权限的问题
2018/05/17 Javascript
关于React动态加载路由处理的相关问题
2019/01/07 Javascript
Android 自定义view仿微信相机单击拍照长按录视频按钮
2019/07/19 Javascript
微信小程序 SOTER 生物认证DEMO 指纹识别功能
2019/12/13 Javascript
javascript实现拖拽碰撞检测
2020/03/12 Javascript
记一次用ts+vuecli4重构项目的实现
2020/05/21 Javascript
python集合用法实例分析
2015/05/30 Python
pandas 取出表中一列数据所有的值并转换为array类型的方法
2018/04/11 Python
python3 pandas 读取MySQL数据和插入的实例
2018/04/20 Python
python导入库的具体方法
2020/06/18 Python
Flask缓存静态文件的具体方法
2020/08/02 Python
Pandas的数据过滤实现
2021/01/15 Python
一款纯css3实现的鼠标悬停动画按钮
2014/12/29 HTML / CSS
HTML5 的新的表单元素(datalist/keygen/output)使用介绍
2013/07/19 HTML / CSS
Avène雅漾美国官方网站:敏感肌肤护理专家
2016/10/24 全球购物
Saucony澳大利亚官网:美国跑鞋品牌,运动鞋中的劳斯莱斯
2018/05/05 全球购物
丝芙兰意大利官方网站:Sephora.it
2019/12/13 全球购物
介绍一下sql server的安全性
2014/08/10 面试题
大学军训感言800字
2014/02/27 职场文书
公司担保书格式范文
2014/05/12 职场文书
学校党员对照检查材料
2014/08/28 职场文书
乡领导班子四风问题对照检查材料
2014/09/25 职场文书
黄河绝恋观后感
2015/06/08 职场文书
python小程序之飘落的银杏
2021/04/17 Python