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中表达式i += x与i = i + x是否等价
Feb 08 Python
Python对字符串实现去重操作的方法示例
Aug 11 Python
浅谈python函数之作用域(python3.5)
Oct 27 Python
python实现简单遗传算法
Mar 19 Python
python实现电脑自动关机
Jun 20 Python
python利用tkinter实现屏保
Jul 30 Python
应用OpenCV和Python进行SIFT算法的实现详解
Aug 21 Python
新年福利来一波之Python轻松集齐五福(demo)
Jan 20 Python
python实现五子棋程序
Apr 24 Python
浅谈Python爬虫原理与数据抓取
Jul 21 Python
python tkinter Entry控件的焦点移动操作
May 22 Python
python 爬取华为应用市场评论
May 29 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
解析mysql中UNIX_TIMESTAMP()函数与php中time()函数的区别
2013/06/24 PHP
PHP获取栏目的所有子级和孙级栏目的ID号示例
2014/04/01 PHP
PHP中Enum(枚举)用法实例详解
2015/12/07 PHP
header与缓冲区之间的深层次分析
2016/07/30 PHP
php微信开发之百度天气预报
2016/11/18 PHP
Laravel中七个非常有用但很少人知道的Carbon方法
2017/09/21 PHP
php微信支付之公众号支付功能
2018/05/30 PHP
thinkphp3.2框架中where条件查询用法总结
2019/08/13 PHP
PHP设计模式之数据访问对象模式(DAO)原理与用法实例分析
2019/12/12 PHP
javascript 建设银行登陆键盘
2008/06/10 Javascript
javascript 树控件 比较好用
2009/06/11 Javascript
jquery鼠标放上去显示悬浮层即弹出定位的div层
2014/04/25 Javascript
jquery中each方法示例和常用选择器
2014/07/08 Javascript
JS数字抽奖游戏实现方法
2015/05/04 Javascript
js+html5实现canvas绘制椭圆形图案的方法
2016/05/21 Javascript
AngularJS学习第二篇 AngularJS依赖注入
2017/02/13 Javascript
分析JavaScript数组操作难点
2017/12/18 Javascript
使用vue实现grid-layout功能实例代码
2018/01/05 Javascript
使用apifm-wxapi快速开发小程序过程详解
2019/08/05 Javascript
[01:22:29]真视界:2019年国际邀请赛总决赛
2020/01/29 DOTA
python求素数示例分享
2014/02/16 Python
利用Python求阴影部分的面积实例代码
2018/12/05 Python
python游戏地图最短路径求解
2019/01/16 Python
Python中的self用法详解
2019/08/06 Python
python中的&amp;&amp;及||的实现示例
2019/08/07 Python
Python 批量读取文件中指定字符的实现
2020/03/06 Python
对python中各个response的使用说明
2020/03/28 Python
Python标准库:内置函数max(iterable, *[, key, default])说明
2020/04/25 Python
Django之腾讯云短信的实现
2020/06/12 Python
有关pycharm登录github时有的时候会报错connection reset的问题
2020/09/15 Python
PyCharm+Miniconda3安装配置教程详解
2021/02/16 Python
简洁自适应404页面HTML好看的404源码
2020/12/16 HTML / CSS
运动会广播稿50字
2014/01/26 职场文书
2014小学生国庆65周年演讲稿
2014/09/21 职场文书
家属联谊会致辞
2015/07/31 职场文书
详解Python flask的前后端交互
2022/03/31 Python