问题
I'm searching for a kind of priority queue which allows me to give two priorites. I want that it just check for the first value then for the second one Here is some Code
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'))
now i want the following order of the elements
Important job
Mid_level job
Low_level job
how can i create such an order with one queue?
回答1:
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:
Just use the (fpriority, spriority)
tuple as the priority. That'll do the sorting you want (compare first, then second to break ties).
回答3:
Using NPE's strategy - a tuple as the queue priority, the tuple being (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
>>>
This should work for any number of items in a priority tuple.
>>>
>>> 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)]
>>>
来源:https://stackoverflow.com/questions/22733351/priority-queue-with-two-priorities-python