众所周知,插入优先级队列的元素具有确定其优先级的值。例如,如果我有五个元素A,B,C,D,E
具有优先级(我们称之为优先级值priorityI
):
A = 10, B = 5, C = 1, D = 3, E = 2
。
但是我如何编写一个可以定义两个优先级值的优先级队列,我的意思是:
如果两个元素具有相同的值priorityI
,然后值priorityII
决定应该首先采用哪个元素,例如:
element A has priorityI = 3, and prioriotyII = 5
element B has priorityI = 3, and prioriotyII = 1
那么第一个元素 B 将首先从队列中取出。
从Python2.6开始,可以使用队列.优先级队列 http://docs.python.org/library/queue.html#Queue.PriorityQueue.
插入队列的项目根据它们的顺序进行排序__cmp__ http://docs.python.org/reference/datamodel.html#object.__cmp__方法,因此只需为要插入队列的对象的类实现一个方法即可。
请注意,如果您的项目由对象元组组成,则不需要为元组实现容器类,因为内置元组比较实现 https://stackoverflow.com/a/5292332/3903832可能符合您的需求,如上所述(首先弹出价值较低的项目)。不过,您可能需要实施__cmp__
其对象驻留在元组中的类的方法。
>>> from Queue import PriorityQueue
>>> priority_queue = PriorityQueue()
>>> priority_queue.put((1, 2))
>>> priority_queue.put((1, 1))
>>> priority_queue.get()
(1, 1)
>>> priority_queue.get()
(1, 2)
EDIT:正如 @Blckknght 指出的,如果您的优先级队列仅由单个线程使用,则heapq http://docs.python.org/library/heapq.html从Python2.3 开始提供的模块是首选解决方案。如果有,请参考他的回答 https://stackoverflow.com/a/25233779/3903832.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)