实现一个优先级队列
import heapq
class PriorityQueue:
def __init__(self):
self._queue = []
self._index = ()
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]
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)
q.pop()
q.pop()
q.pop()
q.pop()
######输出
Item('bar')
Item('spam')
Item('foo')
Item('grok')
可以看到第一个pop返回优先级最高的元素。
在代码中队列包含了一个(-priority,index,item)的元组,优先级为负数的目的是使得元素按照优先级从高到低排序,这个跟普通的按优先级从低到高排序的堆排序恰好相反。