Python Priority Two Priority Queue

I am looking for some priority order that allows me to give two priorities. I want it to just check the first value and then the second. Here are some codes

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 item order

 Important job Mid_level job Low_level job 

How can I create this order with one queue?

+2
python priority-queue
source share
3 answers
 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 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
source share

Just use the tuple (fpriority, spriority) as priority. This will do the sorting you want (first compare and then break the links).

+4
source share

Using NPE strategy - tuple as a priority of a queue, tuple (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 elements in the 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)] >>> 
+1
source share

All Articles