本文实例讲述了Python实现优先级队列的方法。分享给大家供大家参考,具体如下:
问题:要实现一个队列,它能够以给定的优先级对元素排序,且每次pop操作时都会返回优先级最高的那个元素;
# 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,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,1,2,a<c) >>> a<b: True a<c: True >>>
如果想将这个队列用于线程间通信,还需要增加适当的锁和信号机制。
(代码摘自《Python Cookbook》)
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python数据结构与算法教程》、《Python加密解密算法与技巧总结》、《Python编码操作技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》
希望本文所述对大家Python程序设计有所帮助。
您可能感兴趣的文章:
- Python cookbook(数据结构与算法)将序列分解为单独变量的方法
- Python cookbook(数据结构与算法)找出序列中出现次数最多的元素算法示例
- Python cookbook(数据结构与算法)从序列中移除重复项且保持元素间顺序不变的方法
- python实现获取序列中最小的几个元素
- 利用Python找出序列中出现最多的元素示例代码
- Python cookbook(数据结构与算法)根据字段将记录分组操作示例
- Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
- Python cookbook(数据结构与算法)实现查找两个字典相同点的方法
- Python cookbook(数据结构与算法)字典相关计算问题示例
- Python cookbook(数据结构与算法)找到最大或最小的N个元素实现方法示例
- Python cookbook(数据结构与算法)保存最后N个元素的方法
- Python cookbook(数据结构与算法)筛选及提取序列中元素的方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。