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使用beautifulsoup从爱奇艺网抓取视频播放
Jan 23 Python
Python脚本判断 Linux 是否运行在虚拟机上
Apr 25 Python
详解如何用OpenCV + Python 实现人脸识别
Oct 20 Python
Windows环境下python环境安装使用图文教程
Mar 13 Python
Python实现基于KNN算法的笔迹识别功能详解
Jul 09 Python
有关Python的22个编程技巧
Aug 29 Python
pycharm重命名文件的方法步骤
Jul 29 Python
Django配置MySQL数据库的完整步骤
Sep 07 Python
检测tensorflow是否使用gpu进行计算的方式
Feb 03 Python
Python编程快速上手——强口令检测算法案例分析
Feb 29 Python
django实现后台显示媒体文件
Apr 07 Python
Pyinstaller打包Scrapy项目的实现步骤
Sep 22 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
PHP5 面向对象程序设计
2008/02/13 PHP
PHP OPCode缓存 APC详细介绍
2010/10/12 PHP
thinkphp的dump函数无输出实例代码
2016/11/15 PHP
yii2学习教程之5种内置行为类详解
2017/08/03 PHP
Laravel模糊查询区分大小写的实例
2019/09/29 PHP
让Firefox支持event对象实现代码
2009/11/07 Javascript
js 剪切板的用法(clipboardData.setData)与js match函数介绍
2013/11/19 Javascript
jquery 隐藏与显示tr标签示例代码
2014/06/06 Javascript
javascript继承的六大模式小结
2015/04/13 Javascript
echart简介_动力节点Java学院整理
2017/08/11 Javascript
全选复选框JavaScript编写小结(附代码)
2017/08/16 Javascript
聊聊那些使用前端Javascript实现的机器学习类库
2017/09/18 Javascript
如何解决js函数防抖、节流出现的问题
2019/06/17 Javascript
nodeJs的安装与npm全局环境变量的配置详解
2020/01/06 NodeJs
Vue 嵌套路由使用总结(推荐)
2020/01/13 Javascript
[02:57]DOTA2英雄基础教程 风行者
2014/01/16 DOTA
[59:15]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第一场 11.20
2020/11/20 DOTA
python中Genarator函数用法分析
2015/04/08 Python
python验证码识别实例代码
2018/02/03 Python
TensorFlow实现创建分类器
2018/02/06 Python
python实现字符串完美拆分split()的方法
2019/07/16 Python
使用python模拟高斯分布例子
2019/12/09 Python
python 类之间的参数传递方式
2019/12/20 Python
python+gdal+遥感图像拼接(mosaic)的实例
2020/03/10 Python
python 三种方法实现对Excel表格的读写
2020/11/19 Python
html5基础教程常用技巧整理
2013/08/20 HTML / CSS
瑞典快乐袜子:Happy Socks
2018/02/16 全球购物
OSPREY LONDON官网:英国本土皮具品牌
2019/05/31 全球购物
如何写一份好的自荐信
2014/01/02 职场文书
学校创先争优活动总结
2014/08/28 职场文书
合作合同协议书范本
2015/01/27 职场文书
企业党建工作总结2015
2015/05/26 职场文书
学校财务管理制度
2015/08/04 职场文书
党校培训学习心得体会
2016/01/06 职场文书
同学联谊会邀请函
2019/06/24 职场文书
Vue的列表之渲染,排序,过滤详解
2022/02/24 Vue.js