Подтвердить что ты не робот

Приоритетная очередь с более высоким приоритетом сначала в Python

Мне нужна очередь приоритетов, которая сначала получает элемент с наивысшим приоритетом. В настоящее время я использую класс PriorityQueue из библиотеки Queue. Однако эта функция возвращает только элементы с наименьшим значением. Я использовал некоторые уродливые решения, такие как (sys.maxint - priority) как приоритет, но просто задавался вопросом, существует ли более элегантное решение.

4b9b3361

Ответ 1

Вместо этого используйте отрицательный приоритет, нет необходимости вычитать из sys.maxint.

queue.put((-priority, item))

Элемент с приоритетом -10 будет возвращен перед элементами с приоритетом -5, например.

Ответ 2

Вы можете расширить приоритетную очередь, чтобы сохранить логику без изменений:

from Queue import PriorityQueue

class DualPriorityQueue(PriorityQueue):
    def __init__(self, maxPQ=False):
        PriorityQueue.__init__(self)
        self.reverse = -1 if maxPQ else 1

    def put(self, priority, data):
        PriorityQueue.put(self, (self.reverse * priority, data))

    def get(self, *args, **kwargs):
        priority, data = PriorityQueue.get(self, *args, **kwargs)
        return self.reverse * priority, data


minQ = DualPriorityQueue()
maxQ = DualPriorityQueue(maxPQ=True)

minQ.put(10, 'A')
minQ.put(100, 'A')


maxQ.put(10, 'A')
maxQ.put(100,'A')

print "Min DQ: {}".format(minQ.get())
print "Max DQ: {}".format(maxQ.get())

Выход:

Min DQ: (10, 'A')
Max DQ: (100, 'A')