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实现获取客户机上指定文件并传输到服务器的方法
Mar 16 Python
浅谈MySQL中的触发器
May 05 Python
Python os模块学习笔记
Jun 21 Python
python实现Adapter模式实例代码
Feb 09 Python
对python内置map和six.moves.map的区别详解
Dec 19 Python
Python面向对象类编写细节分析【类,方法,继承,超类,接口等】
Jan 05 Python
python实现自动化上线脚本的示例
Jul 01 Python
Django对接支付宝实现支付宝充值金币功能示例
Dec 17 Python
python 字典和列表嵌套用法详解
Jun 29 Python
Opencv实现二维直方图的计算及绘制
Jul 21 Python
Python字典的基础操作
Nov 01 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之第三天
2006/10/09 PHP
PHP入门之常量简介和系统常量
2014/05/12 PHP
Laravel框架数据库迁移操作实例详解
2020/04/06 PHP
基于jquery的仿百度搜索框效果代码
2011/04/11 Javascript
javascript函数定义的几种区别小结
2014/01/06 Javascript
jquery 按键盘上的enter事件
2014/05/11 Javascript
排序算法的javascript实现与讲解(99js手记)
2014/09/28 Javascript
JavaScript中的分号插入机制详细介绍
2015/02/11 Javascript
JS+CSS实现仿触屏手机拨号盘界面及功能模拟完整实例
2015/05/16 Javascript
JavaScript获取客户端IP的方法(新方法)
2016/03/11 Javascript
JS实现的验证身份证及获取地区功能示例
2017/01/16 Javascript
JavaScript正则表达式exec/g实现多次循环用法示例
2017/01/17 Javascript
Js自动截取字符串长度,添加省略号(……)的实现方法
2017/03/06 Javascript
vue 系列——vue2-webpack2框架搭建踩坑之路
2017/12/22 Javascript
vue组件定义,全局、局部组件,配合模板及动态组件功能示例
2019/03/19 Javascript
JavaScript面试技巧之数组的一些不low操作
2019/03/22 Javascript
详解微信小程序轨迹回放实现及遇到的坑
2021/02/02 Javascript
Python3读取文件常用方法实例分析
2015/05/22 Python
Python实现脚本锁功能(同时只能执行一个脚本)
2017/05/10 Python
浅谈Python2获取中文文件名的编码问题
2018/01/09 Python
Python tkinter三种布局实例详解
2020/01/06 Python
Python标准库itertools的使用方法
2020/01/17 Python
Python @property原理解析和用法实例
2020/02/11 Python
python去除删除数据中\u0000\u0001等unicode字符串的代码
2020/03/06 Python
python+selenium爬取微博热搜存入Mysql的实现方法
2021/01/27 Python
CSS3制作轮播图的一种方法
2019/11/11 HTML / CSS
Skyscanner澳大利亚:全球领先的旅游搜索网站
2018/03/24 全球购物
配件采购员岗位职责
2013/12/03 职场文书
三年大学自我鉴定
2014/01/16 职场文书
开学典礼感言
2014/02/16 职场文书
李开复演讲稿
2014/05/24 职场文书
教师师德师风自我剖析材料
2014/09/29 职场文书
无子女夫妻离婚协议书(4篇)
2014/10/20 职场文书
2016见义勇为事迹材料汇总
2016/03/01 职场文书
javascript函数式编程基础
2021/09/15 Javascript
JavaScript 反射学习技巧
2021/10/16 Javascript