实现优先级队列 --heapq模块

以给定的优先级对元素进行排序,每次pop删除优先级最高的

# coding=utf-8
# example.py
#
# Example of a priority queue

import heapq

class PriorityQueue:
    def __init__(self):
        self._queue = []
        self._index = 0

    def push(self, item, priority):
        heapq.heappush(self._queue, (-priority, self._index, item)) #在这里就是依据优先级的负数作排序依据,最小的在左边,是第0个值
        self._index += 1    #当优先级一样是,index按照小的先输出,保证了先进先出

    def pop(self):
        return heapq.heappop(self._queue)[-1]   #返回item

# Example use
class Item:
    def __init__(self, name):
        self.name = name
    def __repr__(self):
        return ‘Item({!r})‘.format(self.name)#!后面可以加s r分别对应str() repr() ,和%用法类似,s没括号,r有括号

q = PriorityQueue()
q.push(Item(‘foo‘), 1)
q.push(Item(‘bar‘), 5)
q.push(Item(‘spam‘), 4)
q.push(Item(‘grok‘), 1)

print("Should be bar:", q.pop())
print("Should be spam:", q.pop())
print("Should be foo:", q.pop())
print("Should be grok:", q.pop())
a=[5,8,9]
b=[5,1,2]
c=[4,6,7]
ss=[]
heapq.heappush(ss,a)#是按照a中序列的第一个作排序依据的
heapq.heappush(ss,b)
heapq.heappush(ss,c)
print ss
s=heapq.heappop(ss)[-1]
print s,ss
s=heapq.heappop(ss)[-1]
print s,ss
s=heapq.heappop(ss)[-1]
print s,ss

结果:

H:\Python27_64\python.exe H:/myfile/python-cookbook-master/src/1/implementing_a_priority_queue/example.py
(‘Should be bar:‘, Item(‘bar‘))
(‘Should be spam:‘, Item(‘spam‘))
(‘Should be foo:‘, Item(‘foo‘))
(‘Should be grok:‘, Item(‘grok‘))
[[4, 6, 7], [5, 8, 9], [5, 1, 2]]
7 [[5, 1, 2], [5, 8, 9]]
2 [[5, 8, 9]]
9 []

进程已结束,退出代码0

时间: 2025-02-01 05:10:53

实现优先级队列 --heapq模块的相关文章

【python cookbook】【数据结构与算法】5.实现优先级队列

问题:要实现一个队列,它能够以给定的优先级对元素排序,且每次pop操作时都会返回优先级最高的那个元素: 解决方案:采用heapq模块实现一个简单的优先级队列 # example.py # # Example of a priority queue import heapq class PriorityQueue: def __init__(self): self._queue = [] self._index = 0 def push(self, item, priority): heapq.h

1.5 实现优先级队列

body, td { font-family: 微软雅黑; font-size: 10pt; } Edit 1.5 实现优先级队列 问题: 实现一个队列,能够按照给定的优先级排序,并且每次pop操作时都可以返回优先级最高的那个元素. 解决方案 1.import heapq2.class PriorityQueue:3. def __init__(self):4. self._queue=[]5. self._index=06. def push(self,item,priority):7. he

Python 单向队列Queue模块详解

单向队列Queue,先进先出 '''A multi-producer, multi-consumer queue.''' try: import threading except ImportError: import dummy_threading as threading from collections import deque from heapq import heappush, heappop from time import monotonic as time __all__ =

[PY3]——实现一个优先级队列

import heapq class PriorityQueue: def __init__(self): self._queue=[] self._index=0 def push(self,item,priority): heapq.heappush(self._queue,(-priority,self._index,item)) self._index+=1 def pop(self): return heapq.heappop(self._queue)[-1] class Item:

实现优先级队列

问题 想要实现一个队列,它能够以给定的优先级来对元素排序,且每次pop操作时都会返回优先级最高的那个元素. 解决方案 下面的类利用heapq模块实现了一个简单的优先级队列 import heapq class PriorityQueue: def __init__(self): self._queue = [] self._index = 0 def push(self, item, priority): heapq.heappush(self._queue, (-priority, self.

python[数据]--队列,堆,优先级队列

队列:from collections import deque:实现保存最后几条历史记录,list = deque(maxlen=6),那么超过六条记录会删除之前的记录. 堆:import heapq;最大特点是第一弹出的元素总是堆中最小的元素:list=[1,2,3] heap=heapq.heapify(list) ,nlargest(3,数据,key=lambda) nsmallest() 优先级队列:堆中的元素(-优先级,序号,item)这样即可实现优先级,优先级越高最先pop出堆,优

python多线程--优先级队列(Queue)

Python的Queue模块中提供了同步的.线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列PriorityQueue.这些队列都实现了锁原语,能够在多线程中直接使用.可以使用队列来实现线程间的同步. Queue模块中的常用方法: Queue.qsize() 返回队列的大小 Queue.empty() 如果队列为空,返回True,反之False Queue.full() 如果队列满了,返回True,反之False Queue.fu

Python的并发并行[2] -> 队列 -> queue 模块

queue 模块 / queue Module 1 常量 / Constants Pass 2 函数 / Function Pass 3 类 / Class 3.1 Queue类 类实例化:queue = queue.Queue(maxsize=0) 类的功能:用于生成一个先入先出队列实例 传入参数: maxsize maxsize: int类型,队列的最大值,无空间时阻塞,未指定时为无限队列 返回参数: queue queue: instance类型,生成的先入先出队列实例 3.1.1 put

个推基于 Apache Pulsar 的优先级队列方案

作者:个推平台研发工程师 祥子 一.业务背景 在个推的推送场景中,消息队列在整个系统中占有非常重要的位置.当 APP 有推送需求的时候, 会向个推发送一条推送命令,接到推送需求后,我们会把APP要求推送消息的用户放入下发队列中,进行消息下发:当同时有多个APP进行消息下发时,难免会出现资源竞争的情况, 因此就产生了优先级队列的需求,在下发资源固定的情况下, 高优先级的用户需要有更多的下发资源. 二.基于 Kafka 的优先级队列方案 针对以上场景,个推基于 Kafka 设计了第一版的优先级队列方