如何在Python中反转优先队列而不使用类?

10 投票
1 回答
9585 浏览
提问于 2025-04-28 06:53

我正在学习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]

撰写回答