我需要一个队列结构,按插入值对元素(id,value)进行排序。此外,我需要能够删除具有最高值的元素。我不需要这种结构是线程安全的。在Java中,我猜这与PriorirtyQueue相对应。
我应该在Python中使用什么结构?你能提供一个玩具的例子吗?
答案 0 :(得分:5)
Python有something similar(它实际上是heapq
的线程安全包装器):
from Queue import PriorityQueue
q = PriorityQueue()
q.put((-1, 'foo'))
q.put((-3, 'bar'))
q.put((-2, 'baz'))
您可以使用q.get()
获得最低的数字,而不是最大的数字:
>>> q.get()
(-3, 'bar')
如果您不喜欢底片,可以覆盖_get
方法:
class PositivePriorityQueue(PriorityQueue):
def _get(self, heappop=max):
return heappop(self.queue)
答案 1 :(得分:2)
答案 2 :(得分:0)
我认为您正在寻找的内容可以在heapq库中找到。来自http://docs.python.org/2/library/heapq.html:
Heap elements can be tuples. This is useful for assigning comparison values (such as task priorities) alongside the main record being tracked:
>>> import heapq
>>>
>>> h = []
>>> heappush(h, (5, 'write code'))
>>> heappush(h, (7, 'release product'))
>>> heappush(h, (1, 'write spec'))
>>> heappush(h, (3, 'create tests'))
>>> heappop(h)
(1, 'write spec')
这是理想的行为吗?
答案 3 :(得分:0)
heapq
使用优先级队列,但它是最小堆,因此您需要将值设为负值。此外,您需要将id放在第二位,因为排序是从左到右完成的。
>>> import heapq
>>> queue = []
>>> heapq.heappush(queue, (-1, 'a'))
>>> heapq.heappush(queue, (-2, 'a'))
>>> heapq.heappop(queue)
(-2, 'a')