实现一个优先级队列

import heapqclass PriorityQueue:def __init__(self):self._queue = []self._index = ()def push(self,item,priority):heapq.heappush(self._queue,(-priority,self._index,item))self._index += 1def pop(self):return heapq.heappop(self._queue)[-1]class Item:def __init__(self,name):self.name = namedef __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)
q.pop()
q.pop()
q.pop()
q.pop()######输出
Item('bar')
Item('spam')
Item('foo')
Item('grok')

可以看到第一个pop返回优先级最高的元素。

在代码中队列包含了一个(-priority,index,item)的元组,优先级为负数的目的是使得元素按照优先级从高到低排序,这个跟普通的按优先级从低到高排序的堆排序恰好相反。

Python实战从入门到精通第四讲——数据结构与算法2之实现一个优先级队列相关推荐

  1. Python实战从入门到精通第六讲——数据结构与算法4之过滤序列元素

    一个数据序列,想利用一些规则从中提取出需要的值或者是缩短序列 最简单的过滤序列元素的方法就是使用列表推导: >>> mylist = [1, 4, -5, 10, -7, 2, 3, ...

  2. Python实战从入门到精通第二十讲——调用父类方法

    在子类中调用父类的某个已经被覆盖的方法. 为了调用父类(超类)的一个方法,可以使用 super() 函数,比如: class A:def spam(self):print('A.spam')class ...

  3. Python实战从入门到精通第七讲——字符串与文本1之字符串开头或结尾匹配

    通过指定的文本模式去检查字符串的开头或者结尾,比如文件名后缀,URL Scheme等等. 检查字符串开头或结尾的一个简单方法是使用 str.startswith() 或者是 str.endswith( ...

  4. Python实战从入门到精通第二十一讲——构建一个模块的层级包

    想将你的代码组织成由很多分层模块构成的包. 封装成包是很简单的.在文件系统上组织你的代码,并确保每个目录都定义了一个__init__.py文件. 例如: graphics/__init__.pypri ...

  5. Python实战从入门到精通第十七讲——将单方法的类转换为函数

    有一个除 __init__() 方法外只定义了一个方法的类.为了简化代码,你想将它转换成一个函数. 大多数情况下,可以使用闭包来将单个方法的类转换成函数. 举个例子,下面示例中的类允许使用者根据某个模 ...

  6. Python实战从入门到精通第十一讲——可接受任意数量参数的函数

    构造一个可接受任意数量参数的函数. 为了能让一个函数接受任意数量的位置参数,可以使用一个*参数.例如: def avg(first, *rest):return (first + sum(rest)) ...

  7. Python实战从入门到精通第十讲——字符串与文本4之字符串搜索和替换

    在字符串中搜索和匹配指定的文本模式 对于简单的字面模式,直接使用 str.replace() 方法即可,比如: >>> text = 'yeah, but no, but yeah, ...

  8. Python实战从入门到精通第八讲——字符串与文本2之合并拼接字符串

    将几个小的字符串合并为一个大的字符串 合并的字符串是在一个序列或者 iterable 中,那么最快的方式就是使用 join() 方法.比如: >>> parts = ['Is', ' ...

  9. 【Python】Python实战从入门到精通之三 -- 教你使用Python中条件语句

    本文是Python实战–从入门到精通系列的第三篇文章: Python实战从入门到精通第1讲–Python中的变量和数据类型 Python实战从入门到精通第2讲–Python中列表操作详解 Python ...

最新文章

  1. 移动端网页乱象怎么破?搜狗搜索正在为行业建言
  2. JSR-303 Bean Validation 介绍及 Spring MVC 服务端验证最佳实践
  3. Linux系统运维工程师PDF文档精选
  4. logrotate机制和原理
  5. React 的组件与 this.props对象
  6. OpenCASCADE:OCCT应用框架OCAF之函数机制使用示例
  7. 数据库中的null和c#中的null
  8. Java快速开发框架LML简介
  9. angularjs组件间通讯_angular组件间通讯的实现方法示例
  10. 安卓案例:安卓对话框演示
  11. Silverlight 游戏开发小技巧:扇形排列元素
  12. 利用FGSM实现对抗样本攻击
  13. 滚动抽奖html怎么做的,抽奖.html
  14. Win10计算机窗口空白,windows10语言栏丢失怎么办?win10语言栏显示空白的解决办法...
  15. 二、为jupyter notebook 添加标题
  16. 解决github.com 的响应时间过长
  17. python基础-07-元组/字典的常用基本操作
  18. 【高数】高数竞赛必背重点(随时更)
  19. 分享复习经验和后台开发面经,已拿offer入职
  20. ON在电子计算机上是什么键,计算机on是什么键

热门文章

  1. 今日恐慌与贪婪指数为94 贪婪程度有所上升
  2. SAP License:GL显示行项目
  3. Flask+Axios+jQuery构建前后端通信的小例子
  4. 产品需求文档、需求结构图、数据字典、全局说明、用例描述、需求描述、逻辑流程、原型设计、页面交互、登录注册、词汇表、数据统计、用户表设计、接口需求、功能清单、业务流程图、Axure原型、prd、文档实例
  5. python基础一 day17 二分查找算法
  6. CLR via C# 中关于装箱拆箱的摘录
  7. 使用Github官方提供的gitignore过滤Git提交的文件
  8. 回车,根据编码获取相应记录,然后再将这录绑定到AutoList
  9. Python 命令行非阻塞输入
  10. APIO 2014 回文串(Manacher+后缀自动机+倍增)