具有两个优先级Python的优先级队列

时间:2014-03-29 15:59:32

标签: python priority-queue

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

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

如何使用一个队列创建这样的订单?

3 个答案:

答案 0 :(得分:5)

只需使用(fpriority, spriority)元组作为优先级。这将进行你想要的排序(先比较,然后第二次打破关系)。

答案 1 :(得分:3)

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

答案 2 :(得分:2)

使用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)]
>>>