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
ealeon 27 Июн 2019 в 02:11

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')
4
Ghassen 26 Июн 2019 в 23:31

Нет способа изменить поведение класса очереди. Я бы украсил предметы перед их постановкой в очередь и разукрашил их после получения, что-то вроде этого:

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(). После этого остальная часть вашего кода продолжает работать, как и раньше.

0
Thomas Blankenhorn 27 Июн 2019 в 00:31

API PriorityQueue позволяет вам определить порядок.

Если вы хотите, чтобы эти строки были в обратном порядке, просто измените значения 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 всегда стоит первым в этой структуре.

0
JacobIRR 26 Июн 2019 в 23:27