在Python中插入时按值对元素进行排序的数据结构

时间:2013-06-03 12:37:54

标签: python queue

我需要一个队列结构,按插入值对元素(id,value)进行排序。此外,我需要能够删除具有最高值的元素。我不需要这种结构是线程安全的。在Java中,我猜这与PriorirtyQueue相对应。

我应该在Python中使用什么结构?你能提供一个玩具的例子吗?

4 个答案:

答案 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)

您可以使用heapq模块。

来自docs:

  

该模块提供了堆队列算法的实现,   也称为优先级队列算法。

答案 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')