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执行shell获取硬件参数写入mysql的方法
Dec 29 Python
Python中运行并行任务技巧
Feb 26 Python
python实现爬虫下载美女图片
Jul 14 Python
在Python的Django框架的视图中使用Session的方法
Jul 23 Python
Python使用multiprocessing实现一个最简单的分布式作业调度系统
Mar 14 Python
详解Python操作RabbitMQ服务器消息队列的远程结果返回
Jun 30 Python
Python判断一个三位数是否为水仙花数的示例
Nov 13 Python
python将字符串转换成json的方法小结
Jul 09 Python
Django中的FBV和CBV用法详解
Sep 15 Python
使用Python操作MySQL的小技巧
Sep 10 Python
Python LMDB库的使用示例
Feb 14 Python
python中zip()函数遍历多个列表方法
Feb 18 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 file_get_contents函数轻松采集html数据
2010/04/22 PHP
PHP转换IP地址到真实地址的方法详解
2013/06/09 PHP
PHP永久登录、记住我功能实现方法和安全做法
2015/04/27 PHP
js 字符串转化成数字的代码
2011/06/29 Javascript
在JS中如何调用JSP中的变量
2014/01/22 Javascript
ExtJs纵坐标值重复问题的解决方法
2014/02/27 Javascript
angularJS 中input示例分享
2015/02/09 Javascript
jQuery抛物线运动实现方法(附完整demo源码下载)
2016/01/08 Javascript
jQuery购物车插件jsorder用法(支持后台处理程序直接转换成DataTable处理)
2016/06/08 Javascript
JavaScript 过滤关键字
2017/03/20 Javascript
Angular.js去除页面中显示的空行方法示例
2017/03/30 Javascript
集合Bootstrap自定义confirm提示效果
2017/09/19 Javascript
JS解决position:sticky的兼容性问题的方法
2017/10/17 Javascript
基于Datatables跳转到指定页的简单实例
2017/11/09 Javascript
JS获取并处理php数组的方法实例分析
2018/09/04 Javascript
vue+element-ui实现表格编辑的三种实现方式
2018/10/31 Javascript
详解JavaScript实现动态的轮播图效果
2019/04/29 Javascript
[06:40]2014DOTA2西雅图国际邀请赛 DK战队巡礼
2014/07/07 DOTA
[01:11:27]2018DOTA2亚洲邀请赛小组赛 A组加赛 Newbee vs Optic
2018/04/03 DOTA
[01:02:20]Mineski vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python排序算法实例代码
2017/08/10 Python
python+django+sql学生信息管理后台开发
2018/01/11 Python
对Tensorflow中权值和feature map的可视化详解
2018/06/14 Python
python3转换code128条形码的方法
2019/04/17 Python
python队列Queue的详解
2019/05/10 Python
python根据时间获取周数代码实例
2019/09/30 Python
Python3爬虫带上cookie的实例代码
2020/07/28 Python
Lampegiganten丹麦:欧洲领先的照明网上商店
2018/04/25 全球购物
大学军训感言
2014/01/10 职场文书
态度决定一切演讲稿
2014/05/20 职场文书
运动会横幅标语
2014/06/17 职场文书
临床医学专业求职信
2014/08/08 职场文书
2015年实习生工作总结报告
2015/04/28 职场文书
教师个人工作总结范文2015
2015/10/14 职场文书
导游词之山西-五老峰
2019/10/07 职场文书
pandas进行数据输入和输出的方法详解
2022/03/23 Python