【问题标题】:Priority Queue with two Priorities Python具有两个优先级 Python 的优先级队列
【发布时间】:2023-04-02 15:54:01
【问题描述】:

我正在寻找一种优先级队列,它允许我给出两个优先级。 我希望它只检查第一个值然后检查第二个值 这是一些代码

import Queue

class Job(object):
    def __init__(self, fpriority, spriority, description, iata , hops, cost):
        self.fpriority = fpriority
        self.spriority = spriority

q = Queue.PriorityQueue()

q.put(Job(2, 5, 'Mid-level job'))
q.put(Job(2, 20, 'Low-level job'))
q.put(Job(1, 20, 'Important job'))

现在我想要以下元素的顺序

Important job
Mid_level job
Low_level job

我怎样才能用一个队列创建这样的订单?

【问题讨论】:

    标签: python priority-queue


    【解决方案1】:

    只需使用(fpriority, spriority) 元组作为优先级。这会做你想要的排序(首先比较,然后是打破平局)。

    【讨论】:

    • 你能写一个小例子吗?我不确定你的意思
    【解决方案2】:
    class Job(object):
        def __init__(self, fpriority, spriority, description, iata , hops, cost):
            self.fpriority = fpriority
            self.spriority = spriority
    
        def __cmp__(self, other):
            '''Comparisons for Python 2.x - it's done differently in 3.x'''
            if self.fpriority > other.fpriority:
                return 1
            elif self.fpriority < other.fpriority:
                return -1
            else:
                if self.spriority > other.spriority:
                    return 1
                elif self.spriority < other.spriority:
                    return -1
                else:
                    return 0
    

    【讨论】:

      【解决方案3】:

      使用NPE的策略——一个元组作为队列优先级,元组为(fpriority, spriority)

      import Queue
      
      class Job(object):
          def __init__(self, fpriority, spriority, description='blah', iata='foo' , hops='ample', cost='free pitchers'):
              self.fpriority = fpriority
              self.spriority = spriority
              self.description = description
          @property
          def priority(self):
              return (self.fpriority, self.spriority)
          def __str__(self):
              return self.description
      
      q = Queue.PriorityQueue()
      
      second = Job(2, 5, 'Mid-level job')
      third = Job(2, 20, 'Low-level job')
      first = Job(1, 20, 'Important job')
      
      q.put((second.priority, second))
      q.put((third.priority, third))
      q.put((first.priority, first))
      
      while q.unfinished_tasks:
          task = q.get()
          print task, task[1]
          q.task_done()
      >>> 
      ((1, 20), <__main__.Job object at 0x02A8F270>) Important job
      ((2, 5), <__main__.Job object at 0x02A8F230>) Mid-level job
      ((2, 20), <__main__.Job object at 0x02A8F250>) Low-level job
      >>> 
      

      这应该适用于优先级元组中的任意数量的项目。

      >>> 
      >>> t = [(1,2),(1,1),(2,2),(2,1),(1,3)]
      >>> sorted(t)
      [(1, 1), (1, 2), (1, 3), (2, 1), (2, 2)]
      >>> t = [(2,2,67),(1,2,3),(1,1,0),(2,2,1),(2,1,78),(1,3,78),(1,2,2),(1,2,1),(1,1,6),(2,1,32)]
      >>> sorted(t)
      [(1, 1, 0), (1, 1, 6), (1, 2, 1), (1, 2, 2), (1, 2, 3), (1, 3, 78), (2, 1, 32), (2, 1, 78), (2, 2, 1), (2, 2, 67)]
      >>>
      

      【讨论】:

        【解决方案4】:

        对于python3,具有两个优先级的优先级队列可以这样实现:

        from queue import PriorityQueue
        
        
        class CustomPriorityQueueItem(object):
            def __init__(self, data, first_priority, second_priority):
                self.first_priority = first_priority
                self.second_priority = second_priority
                self.data = data
        
            def __lt__(self, other):
                if self.first_priority < other.first_priority:
                    return True
                elif self.first_priority == other.first_priority:
                    if self.second_priority < other.second_priority:
                        return True
                    else:
                        return False
                else:
                    return False
        
            def __eq__(self, other):
                if self.first_priority == other.first_priority and self.second_priority == other.second_priority:
                    return True
                else:
                    return False
        
            def __str__(self):
                return str(self.data)
        
            def __repr__(self):
                return self.data
        
        
        class CustomData:
            def __init__(self, name, description):
                self.name = name
                self.description = description
        
            def __str__(self):
                return self.name + ": " + self.description
        
        
        # test data
        
        if __name__ == "__main__":
        
            q = PriorityQueue()
        
            obj_arr = [
                CustomData('name-1', 'description-1'),  # this should come 6th - (3, 2)
                CustomData('name-2', 'description-2'),  # this should come 5st - (3, 1)
                CustomData('name-3', 'description-3'),  # this should come 2nd - (1, 1)
                CustomData('name-4', 'description-4'),  # this should come 1th - (1, 2)
                CustomData('name-5', 'description-5'),  # this should come 3rd - (2, 1)
                CustomData('name-6', 'description-6')   # this should come 4th - (2, 2)
            ]
        
            priorities = [(3, 2), (3, 1), (1, 2), (1, 1), (2, 1), (2, 2)]
        
            itr = 0
            for i in range(len(obj_arr)):
                first_priority = i + 1
                second_priority = itr % 2
                q.put(CustomPriorityQueueItem(
                    obj_arr[i], priorities[itr][0], priorities[itr][1]))
                itr += 1
        
            while not q.empty():
                data = q.get()
                print(str(data))
        

        Output:
        name-4: description-4
        name-3: description-3
        name-5: description-5
        name-6: description-6
        name-2: description-2
        name-1: description-1
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-01-18
          • 2013-02-13
          • 1970-01-01
          • 2016-09-23
          • 2011-12-20
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多