Pycharm:简单的优先级实现_heapq

'''

利用heapq模块的heappop和heappush实现简易的优先级排序,可以简单了解下堆排序的原理

'''

import heapq

class PriorityQueue():

def__init__(self):

self.__queue=[]

self.__index=0

defpush(self,item,priority):

'''

heapq.heappush(heap, item)

将值item推到heap上,保持堆不变。

:param item:

:param priority:

:return:

'''

heapq.heappush(self.__queue, (-priority,self.__index,item))

'''

index的作用是当list[0]相同时,比较第二位,按照顺序进行堆排序,不然就报错了

'''

#self.__index -= 1

self.__index+=1

print(self.__index)

print(self.__queue)

defpop(self):

'''

heapq.heappop(heap)

从heap中弹出并返回最小的项(默认是从第一个排序的),保持堆不变。如果堆为空,则会引发IndexError。

要访问最小的项,不需要弹出它,请使用heap [0]。

:return:

'''

#print(heapq.heappop(self.__queue)[-1])

#return heapq.heappop(self.__queue)[-1]

#使用-1和使用2是一样的效果

return heapq.heappop(self.__queue)[2]

class Item():

def__init__(self,name):

self.name=name

def__repr__(self):

return'Item({!r})'.format(self.name)

__str__=__repr__

if__name__=='__main__':

'''

仔细观察可以发现,第一个pop()操作返回优先级最高的元素。

另外注意到如果两个有着相同优先级的元素( foo和grok ),pop操作按照它们被插入到队列的顺序返回的。

'''

q=PriorityQueue()

q.push(Item('foo'),1)

q.push(Item('bar'),5)

q.push(Item('spam'),4)

q.push(Item('grok'),1)

print(q.pop())

print(q.pop())

print(q.pop())

print(q.pop())

你可能感兴趣的:(Pycharm:简单的优先级实现_heapq)