【问题标题】:Priority queue with higher priority first in PythonPython中优先级较高的优先级队列
【发布时间】:2013-02-13 23:15:03
【问题描述】:

我需要一个优先级队列,它首先获取具有最高优先级值的项目。我目前正在使用 Queue 库中的 PriorityQueue 类。但是,此函数仅首先返回具有最低值的项目。我尝试了一些丑陋的解决方案,例如 (sys.maxint - priority) 作为优先级,但只是想知道是否存在更优雅的解决方案。

【问题讨论】:

    标签: python queue priority-queue


    【解决方案1】:

    改为使用负优先级,无需从sys.maxint 中减去。

    queue.put((-priority, item))
    

    例如,优先级为 -10 的项目将在优先级为 -5 的项目之前返回。

    【讨论】:

    • 虽然这行得通,但它确实让我感到困扰,因为这意味着所有其他相关的逻辑都在你的脑海中被颠倒了。
    • @blueman:然后继承队列类并重写方法为您反转优先级。
    【解决方案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')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-20
      • 1970-01-01
      • 2016-09-23
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      • 2012-02-24
      • 1970-01-01
      相关资源
      最近更新 更多