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变量与常量
Jun 02 Python
不要用强制方法杀掉python线程
Feb 26 Python
Python cookbook(数据结构与算法)字典相关计算问题示例
Feb 18 Python
Python采集代理ip并判断是否可用和定时更新的方法
May 07 Python
Python读取excel中的图片完美解决方法
Jul 27 Python
Python 给某个文件名添加时间戳的方法
Oct 16 Python
django多对多表的创建,级联删除及手动创建第三张表
Jul 25 Python
Python 合并多个TXT文件并统计词频的实现
Aug 23 Python
Python爬虫解析网页的4种方式实例及原理解析
Dec 30 Python
python如何从键盘获取输入实例
Jun 18 Python
Python爬虫入门教程02之笔趣阁小说爬取
Jan 24 Python
python 爬取豆瓣网页的示例
Apr 13 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将数据库导出成excel的方法
2010/05/07 PHP
php7基于递归实现删除空文件夹的方法示例
2017/06/15 PHP
jQuery实现单行文字间歇向上滚动源代码
2013/06/02 Javascript
js实现的切换面板实例代码
2013/06/17 Javascript
Jquery使用Firefox FireBug插件调试Ajax步骤讲解
2013/12/02 Javascript
用Jquery.load载入页面后样式没了页面混乱的解决方法
2014/10/20 Javascript
JS递归遍历对象获得Value值方法技巧
2016/06/14 Javascript
vue-cli2与vue-cli3在一台电脑共存的实现方法
2019/09/25 Javascript
Vue中this.$nextTick的作用及用法
2020/02/04 Javascript
[42:04]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第一局
2016/03/03 DOTA
Python多线程同步Lock、RLock、Semaphore、Event实例
2014/11/21 Python
Python编码类型转换方法详解
2016/07/01 Python
Python3.6 Schedule模块定时任务(实例讲解)
2017/11/09 Python
200 行python 代码实现 2048 游戏
2018/01/12 Python
python实现二叉查找树实例代码
2018/02/08 Python
基于python 二维数组及画图的实例详解
2018/04/03 Python
Python Unittest根据不同测试环境跳过用例的方法
2018/12/16 Python
Linux下Pycharm、Anaconda环境配置及使用踩坑
2018/12/19 Python
Python操作redis实例小结【String、Hash、List、Set等】
2019/05/16 Python
python tools实现视频的每一帧提取并保存
2020/03/20 Python
Django缓存系统实现过程解析
2019/08/02 Python
Python turtle绘画象棋棋盘
2019/08/21 Python
使用TensorFlow-Slim进行图像分类的实现
2019/12/31 Python
PyTorch 解决Dataset和Dataloader遇到的问题
2020/01/08 Python
基于python实现地址和经纬度转换
2020/05/19 Python
使用phonegap获取设备的一些信息方法
2017/03/31 HTML / CSS
美国时尚孕妇装品牌:A Pea in the Pod
2017/07/16 全球购物
初中生学习生活的自我评价
2013/11/20 职场文书
公证委托书格式
2014/09/13 职场文书
师德师风整改措施
2014/10/24 职场文书
2014年环卫工作总结
2014/11/22 职场文书
导师工作推荐信
2015/03/27 职场文书
浅谈JS的二进制家族
2021/05/09 Javascript
豆瓣2021评分最高动画剧集-豆瓣评分最高的动画剧集2021
2022/03/18 日漫
vue使用wavesurfer.js解决音频可视化播放问题
2022/04/04 Vue.js
Django框架模板用法详解
2022/06/10 Python