如何在Python中反转优先队列而不使用类?
我正在学习Python中的优先队列,写了以下代码:
def main():
q=Queue.PriorityQueue()
while True:
n=input("numbre?")
if n==0:
break
else:
q.put(n)
print n
while not q.empty():
print q.get()
当我输入数据,比如:9, 1, 4, 5
它输出的是1, 4, 5, 9,看起来是对的,但我想知道怎么才能反向输出,也就是:9, 5, 4, 1
我知道用类可以做到这一点,但在这种情况下,下面的额外代码:
def __cmp__():
-cmp(q.get(),q.get())
似乎不太管用,有谁能帮帮我吗?
1 个回答
22
常见的做法是把数据和优先级一起作为一个元组插入。所以,你可以简单地把 put
改成这样
q.put((-n ,n))
当比较这些元组时,比如说数字是9、1、4和5,它们会被比较成这样:(-9, 9)、(-1, 1)、(-4, 4) 和 (-5, 5)。因为 -9
是所有数字中最小的,所以它会最先被取出来,然后是-5,再是-4,最后是-1。
举个例子:
from Queue import PriorityQueue
numbers, Q = [9, 1, 4, 5], PriorityQueue()
for number in numbers:
Q.put((-number, number))
while not Q.empty():
print Q.get()
输出结果
(-9, 9)
(-5, 5)
(-4, 4)
(-1, 1)
如果你只想得到实际的值,只需打印第二个元素,像这样
while not Q.empty():
print Q.get()[1]