QuietHeart's Site

python的优先权队列


python的优先权队列

python的优先权队列,根据优先权来进行队列排序, 但是注意优先权队列使用heap实现,而heap不是稳定的排序,所以,想要实现同优先权内部也有序,则需要增加一个计数,表示该优先权的顺序。参考以下代码:

#!/usr/bin/python
from Queue import Queue
from Queue import PriorityQueue
a1='a1'
a2='a2'
a3='a3'
a4='a4'
a5='a5'

b1='b1'
b2='b2'
b3='b3'
b4='b4'
b5='b5'

q = Queue()
pq = PriorityQueue()
for i in xrange(5):
    p = 5 - i
    q.put("a"+str(p))
    q.put("b"+str(p))

    pq.put((p,"a"+str(p)))
    pq.put((p,"b"+str(p)))

for i in xrange(5):
    p = 5 - i
    q.put("a"+str(p)+str(i+5))
    q.put("b"+str(p)+str(i+5))

    pq.put((p,"a"+str(p)+str(i+5)))
    pq.put((p,"b"+str(p)+str(i+5)))

size = q.qsize()
print "queue item size:%s" %size
print "queue items:"
for i in xrange(size):
    print q.get()

size = pq.qsize()
print "priority queue item size:%s" %size
print "priority queue items:"
for i in xrange(size):
    print pq.get()

#"but priority queue with same priority is not queue, if we want so, do the following:"
import itertools
count = itertools.count()
poq = PriorityQueue()
for i in xrange(5):
    p = 5 - i
    poq.put((p,count.next(),"a"+str(p)))
    poq.put((p,count.next(),"b"+str(p)))

for i in xrange(5):
    p = 5 - i
    poq.put((p,count.next(),"a"+str(p)+str(i+5)))
    poq.put((p,count.next(),"b"+str(p)+str(i+5)))


size = poq.qsize()
print "priority ordered queue item size:%s" %size
print "priority ordered queue items:"
for i in xrange(size):
    print poq.get()

输入类似如下:

queue item size:20
queue items:
a5
b5
a4
b4
a3
b3
a2
b2
a1
b1
a55
b55
a46
b46
a37
b37
a28
b28
a19
b19
priority queue item size:20
priority queue items:
(1, 'a1')
(1, 'a19')
(1, 'b1')
(1, 'b19')
(2, 'a2')
(2, 'a28')
(2, 'b2')
(2, 'b28')
(3, 'a3')
(3, 'a37')
(3, 'b3')
(3, 'b37')
(4, 'a4')
(4, 'a46')
(4, 'b4')
(4, 'b46')
(5, 'a5')
(5, 'a55')
(5, 'b5')
(5, 'b55')
priority ordered queue item size:20
priority ordered queue items:
(1, 8, 'a1')
(1, 9, 'b1')
(1, 18, 'a19')
(1, 19, 'b19')
(2, 6, 'a2')
(2, 7, 'b2')
(2, 16, 'a28')
(2, 17, 'b28')
(3, 4, 'a3')
(3, 5, 'b3')
(3, 14, 'a37')
(3, 15, 'b37')
(4, 2, 'a4')
(4, 3, 'b4')
(4, 12, 'a46')
(4, 13, 'b46')
(5, 0, 'a5')
(5, 1, 'b5')
(5, 10, 'a55')
(5, 11, 'b55')

更详细资料,参考: http://hg.python.org/cpython/file/2.7/Lib/Queue.py http://docs.python.org/library/heapq.html?highlight=heapq#heapq