众所周知,插入优先级队列的元素具有确定其优先级的值。例如,如果我有五个元素A,B,C,D,E
具有优先级(让我们称之为优先级值priorityI
):
A = 10, B = 5, C = 1, D = 3, E = 2
。
但是我如何编写一个优先级队列来定义两个优先级值,我的意思是:
如果两个元素具有相同的priorityI
值,则值priorityII
决定应该首先采用哪个元素,例如:
element A has priorityI = 3, and prioriotyII = 5
element B has priorityI = 3, and prioriotyII = 1
然后首先从队列中取出第一个元素B.
答案 0 :(得分:4)
从Python2.6开始,您可以使用Queue.PriorityQueue。
插入到队列中的项目将根据其__cmp__
方法进行排序,因此只需为要将其对象插入队列的类实现一个。
请注意,如果您的项目由对象元组组成,则您不需要为元组实现容器类,因为built in tuple comparison implementation可能符合您的需求,如上所述(弹出较低的值)项目第一)。但是,您可能需要为其对象驻留在元组中的类实现__cmp__
方法。
>>> from Queue import PriorityQueue
>>> priority_queue = PriorityQueue()
>>> priority_queue.put((1, 2))
>>> priority_queue.put((1, 1))
>>> priority_queue.get()
(1, 1)
>>> priority_queue.get()
(1, 2)
编辑:正如@Blckknght所指出的,如果您的优先级队列仅由单个线程使用,那么Python2.3提供的heapq模块是首选解决方案。如果是,请参阅his answer。
答案 1 :(得分:3)
通常的做法是使您的优先级值成为您的两个优先级的元组。 Python以词法方式对元组进行排序,因此它首先将比较每个优先级的第一个元组项目,并且只有它们相等才会比较下一个项目。
在Python中创建优先级队列的常用方法是使用the heapq
module的函数来操作列表。由于比较了整个值,我们可以简单地将两个优先级和一个值放在一个元组中:
import heapq
q = [] # the queue is a regular list
A = (3, 5, "Element A") # our first item, a three-tuple with two priorities and a value
B = (3, 1, "Element B") # a second item
heapq.heappush(q, A) # push the items into the queue
heapq.heappush(q, B)
print(heapq.heappop(q)[2]) # pop the highest priority item and print its value
这会打印"Element B"
。