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 相关文章推荐
vc6编写python扩展的方法分享
Jan 17 Python
python多重继承新算法C3介绍
Sep 28 Python
Python实现截屏的函数
Jul 26 Python
用python写的一个wordpress的采集程序
Feb 27 Python
Python爬虫代理IP池实现方法
Jan 05 Python
Python实现将罗马数字转换成普通阿拉伯数字的方法
Apr 19 Python
python快排算法详解
Mar 04 Python
Python基础学习之时间转换函数用法详解
Jun 18 Python
Pyorch之numpy与torch之间相互转换方式
Dec 31 Python
Python统计文本词汇出现次数的实例代码
Feb 27 Python
Django跨域资源共享问题(推荐)
Mar 09 Python
Python3之乱码\xe6\x97\xa0\xe6\xb3\x95处理方式
May 11 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 命名空间和自动加载原理与用法实例分析
2020/04/29 PHP
PHP实现文件上传与下载
2020/08/28 PHP
Google Map API更新实现用户自定义标注坐标
2009/07/29 Javascript
基于jquery实现的服务器验证控件的启用和禁用代码
2010/04/27 Javascript
javascript开发技术大全 第4章 直接量与字符集
2011/07/03 Javascript
JavaScript转换与解析JSON方法实例详解
2015/11/24 Javascript
js实现的xml对象转json功能示例
2016/12/24 Javascript
js实现二级导航功能
2017/03/03 Javascript
Canvas实现微信红包照片效果
2018/08/21 Javascript
微信小程序bindinput与bindsubmit的区别实例分析
2019/04/17 Javascript
vue+elementUI实现表格关键字筛选高亮
2020/10/26 Javascript
ionic4+angular7+cordova上传图片功能的实例代码
2019/06/19 Javascript
vue实现点击追加选中样式效果
2019/11/01 Javascript
javascript设计模式 ? 模板方法模式原理与用法实例分析
2020/04/23 Javascript
JS定时器如何实现提交成功提示功能
2020/06/12 Javascript
详解vite2.0配置学习(typescript版本)
2021/02/25 Javascript
使用Python脚本操作MongoDB的教程
2015/04/16 Python
python中numpy基础学习及进行数组和矢量计算
2017/02/12 Python
浅析python中的迭代与迭代对象
2018/10/08 Python
Django Admin中增加导出Excel功能过程解析
2019/09/04 Python
Python使用pdb调试代码的技巧
2020/05/03 Python
为什么python比较流行
2020/06/19 Python
selenium判断元素是否存在的两种方法小结
2020/12/07 Python
在css3中background-clip属性与background-origin属性的用法介绍
2012/11/13 HTML / CSS
阿姆斯特丹城市卡:Amsterdam Pass
2019/12/01 全球购物
学习自我鉴定
2014/02/01 职场文书
大学校运会广播稿
2014/02/03 职场文书
乡镇消防工作实施方案
2014/03/27 职场文书
消防宣传口号
2014/06/16 职场文书
五一劳动节活动总结
2015/02/09 职场文书
2015学校六五普法工作总结
2015/04/22 职场文书
项目投资意向书范本
2015/05/09 职场文书
优秀党员先进事迹材料2016
2016/02/29 职场文书
logback如何自定义日志存储
2021/08/30 Java/Android
Python中的datetime包与time包包和模块详情
2022/02/28 Python
选购到合适的激光打印机
2022/04/21 数码科技