python 队列
cliffordl 2024-06-23 10:35:02 阅读 65
1. Queue
在 Python 中 Queue 模块提供了一个同步的线程安全的队列类,它包括常见的 FIFO(先入先出)、LIFO(后入先出)、PriorityQueue(按优先级队列)以及先入先出类型的简单队列(SimpleQueue)。
1.1. 常用方法
1.1.1. 初始化操作
import queue# 先进先出q = queue.Queue(maxsize=5)# 后进先出q = queue.LifoQueue(maxsize=5)# 优先级队列q = queue.PriorityQueue(maxsize=5)# 先进先出类型的简单队列,没有大小限制q = queue.SimpleQueue()
参数 maxsize 是一个整数,表示队列的最大长度,在实际操作中,当队列达到上限时,插入数据会被阻塞,直到有数据出队之后,才可被插入。
该参数默认为 0,即表示队列长度不限制,如果设置为负数,队列长度也无限(一般无人设置为负数)。
1.1.2. 队列新增数据
即将一个值放入队列中,格式如下:
Queue.put(item, [block[, timeout]])
item 必填参数,即插入的值;block 默认为 True。
如果当 block 为 True 时且 timeout 是 None (默认),put() 方法就使调用线程阻塞在这里,直到空出一个数据单元。如果 timeout 是个正数,将最多阻塞 timeout 秒,如果在这段时间没有可用的空闲插槽,将引发 Full 异常。
如果 block 是 False,如果空闲插槽立即可用,则把 item 放入队列,否则引发 Full 异常 ( 在这种情况下,timeout 将被忽略)。
raise Fullqueue.Full
1.1.3. 取队列值
格式如下:
Queue.get(block=True, timeout=None)
该函数表示从队列头部获取一个值,并在队列中删除该值,如果可选参数 block 是 True 并且 timeout 是 None (默认值),则在必要时阻塞至项目可得到。
如果 timeout 是个正数,将最多阻塞 timeout 秒,如果在这段时间内项目不能得到,将引发 Empty 异常。反之 (block 是 False) , 如果一个项目立即可得到,则返回一个项目,否则引发 Empty 异常 (这种情况下,timeout 将被忽略)。
1.1.4. 操作总结
Queue.qsize() 返回队列的大小Queue.empty() 如果队列为空,返回True,反之FalseQueue.full() 如果队列满了,返回True,反之False,Queue.full 与 maxsize 大小对应Queue.get([block[, timeout]])获取队列,timeout等待时间Queue.get_nowait() 相当于Queue.get(False),非阻塞方法Queue.put(item) 写入队列,timeout等待时间Queue.put_nowait(item):等价于 q.put(item, False);Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号。每个get()调用得到一个任务,接下来task_done()调用告诉队列该任务已经处理完毕。Queue.join() 实际上意味着等到队列为空,再执行别的操作
1.2. LILO
先进先出,只能在尾部插入元素,只能从头部取出元素。
from queue import Queueq = Queue() # 创建队列对象q.put(1) # 队列尾部插入元素q.put(2)q.put(3)print(q.queue) # 查看队列中的所有元素a = q.get() # 返回并删除队列头部元素print(a)print(q.queue) # 运行结果deque([2,3])
1.3. LIFO
先进后出,类似栈;
from queue import LifoQueuelifoQueue = LifoQueue() # 创建对象lifoQueue.put(1)lifoQueue.put(2)lifoQueue.put(3)print(lifoQueue.queue)lifoQueue.get() # 返回并删除队列尾部元素print(lifoQueue.queue) # 运行结果[1,2]
1.4. 优先队列
队列元素为元组类型,即(优先级,数据)。
from queue import PriorityQueue as pqpq = pq() # 创建有限队列pq.put(1)pq.put(4)pq.put(3) print(pq.queue) # 运行结果[1,3,4]pq.get() # 返回并删除优先级最低的元素print(pq.queue) # 运行结果[3,4]
参考:
https://zhuanlan.zhihu.com/p/445507165?utm_id=0
2. 双端队列
两端都能编辑,deque既可以用来实现栈(stack)也可以用来实现队列(queue)。
2.1. 基本操作
2.1.1. 入队操作
q.append(4):右端入队一个元素q.appendleft(5):左端入队一个元素q.extend([a,b,x]):右端入队多个元素,相当于多次q.appendq.extendleft([x,y,z]):左端入队多个元素,相当于多次q.appendleft
2.1.2. 出队操作
q.pop():右端出队q.popleft():左端出队
2.1.3. 清空队列
q.clear():清空队列
2.1.4. 队列容量
q.maxlen:队列的最大容量。
如果初始化队列时未指定队列最大容量,那么它是None。
2.1.5. 队列长度
len(q):用函数len测量双端队列q的长度
2.1.6. 队列是否满
q.maxlen == q.popleft():当前长度等于最大长度,双端队列满
2.1.7. 队列是否空
not q:True表示队列为空,否则非空。
2.1.8. 元素个数计算
用于统计相同元素的个数
q=deque([1,2,2,3,4,5,6])print(q.count(2))#2
2.1.9. 删除指定元素
只删除首个元素
q=deque([1,2,2,3,4,5,6])print(q.remove(2))print(q)#deque([1,2,3,4,5,6)]
2.1.10 翻转顺序 reverse
q=deque([1,2,3,4,5,6])print(q.reverse())#deque([6,5,4,3,2,1)]
2.1.11. 轮转 rotate
q=deque([1,2,3,4,5,6])print(q.rotate(1))#deque([6,1,2,3,4,5)]q=deque([1,2,3,4,5,6])print(q.rotate(2))#deque([5,6,1,2,3,4)]q=deque([1,2,3,4,5,6])print(q.rotate(-1))#deque([2,3,4,5,6,1)]q=deque([1,2,3,4,5,6])print(q.rotate(-2))#deque([3,4,5,6,1,2)]
2.2. 特点总结
存储任何数据类型的元素
是可变数据类型
支持带 in 操作符的成员操作
支持索引,比如deque[i]
支持对序列和可迭代对象进行操作的内置函数,比如len(),sorted(),reversed()等
支持正常迭代和反向迭代
支持使用 pickle
支持 maxlen,指定 deque 的最大长度
不支持切片,比如deque[0:2]
不支持 inplace 排序
insert(i, value)# 在索引为i的 deque 容器中插入一个名为 value 的元素remove(value)# 删除第一个出现的 value,如果 value 不存在则引发 ValueErrordeque[i]# 从 deque 容器中检索出索引为 i 的项。del deque[i]# 从 deque 容器中移出索引为i的项
2.3. 实例1
from collections import deque # 双端队列dequeQueue = deque(['Eric','John','Smith'])print(dequeQueue)# deque(['Eric', 'John', 'Smith'])dequeQueue.append('Tom') # 在右侧插入新元素dequeQueue.appendleft('Terry') # 在左侧插入新元素print(dequeQueue)# deque(['Terry', 'Eric', 'John', 'Smith', 'Tom'])dequeQueue.rotate(2) #循环右移2次print(dequeQueue)# deque(['Smith', 'Tom', 'Terry', 'Eric', 'John'])dequeQueue.popleft() # 返回并删除队列最左端元素'Smith'print(dequeQueue)# deque(['Tom', 'Terry', 'Eric', 'John'])dequeQueue.pop() # 返回并删除队列最右端元素'John'print(dequeQueue)# deque(['Tom', 'Terry', 'Eric'])
参考:
https://www.php.cn/faq/514200.html
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。