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')
我该怎么办才能以相反的顺序弹出?即下降
答案 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()
来检索项目。此后,您的其余代码将继续工作。