Python优先级队列以降序弹出

时间:2019-06-26 23:11:00

标签: python python-2.7

from queue import PriorityQueue

q = PriorityQueue()

q.put((2, 'code'))
q.put((1, 'eat'))
q.put((3, 'sleep'))

while not q.empty():
    next_item = q.get()
    print(next_item)

# Result:
#   (1, 'eat')
#   (2, 'code')
#   (3, 'sleep')

我该怎么办才能以相反的顺序弹出?即下降

3 个答案:

答案 0 :(得分:3)

您可以将此方法用作技巧,然后乘以-1以颠倒顺序:

q = PriorityQueue()

q.put((2*(-1), 'code'))
q.put((1*(-1), 'eat'))
q.put((3*(-1), 'sleep'))
while not q.empty():
    next_item = q.get()
    print(next_item)

输出:

(-3, 'sleep')
(-2, 'code')
(-1, 'eat')

答案 1 :(得分:0)

通过PriorityQueue API,您可以定义顺序。

如果要以相反的顺序排列这些字符串,只需反转元组中的int值:

from queue import PriorityQueue

q = PriorityQueue()

q.put((2, 'code'))
q.put((3, 'eat'))
q.put((1, 'sleep'))

while not q.empty():
    next_item = q.get()
    print(next_item)

#(1, 'sleep')
#(2, 'code')
#(3, 'eat')

没有办法反转PriorityQueue的行为,而python(非线程安全的)heapq使用相同的顺序。但我明白您的意思,由于MinPriorityQueue在此结构中始终排在首位,因此真实名称应该是“ 1”。

答案 2 :(得分:0)

无法更改队列类的行为。我会先对项目进行装饰,然后再对它们进行排队,然后在检索它们后取消对它们的装饰,如下所示:

def decorated(item):
    return (-item[0],) + item

def undecorated(item):
    return item[1:]

这使您可以按正确的顺序排队的物品:

>>> decorated(1, 'eat')
(-1, 1, 'eat')
>>> undecorated(-1, 1, 'eat')
(1, 'eat')

这样,您可以说q.put(decorated(item))而不是q.put(item)。类似地,您说undecorated(q.get())而不是q.get()来检索项目。此后,您的其余代码将继续工作。