具有两个优先级 Python 的优先级队列
Posted
技术标签:
【中文标题】具有两个优先级 Python 的优先级队列【英文标题】:Priority Queue with two Priorities Python 【发布时间】:2014-03-29 15:59:31 【问题描述】:我正在寻找一种优先级队列,它允许我给出两个优先级。 我希望它只检查第一个值然后检查第二个值 这是一些代码
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
我怎样才能用一个队列创建这样的订单?
【问题讨论】:
【参考方案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
【讨论】:
以上是关于具有两个优先级 Python 的优先级队列的主要内容,如果未能解决你的问题,请参考以下文章