优先队列PriorityQueue
单个数值
from queue import PriorityQueue
pq = PriorityQueue(maxsize=10) # 创建最大容量为10的优先队列
pq.put(2)
pq.put(1)
pq.put(3)
pq.put(1)
print(pq.get())
print(pq.get())
print(pq.get())
--> 1
--> 1
--> 2
多个数值
当保存项包含多个不同类型的值时,先按第一个值排序
from queue import PriorityQueue
pq = PriorityQueue()
pq.put(("b", 1))
pq.put(("a", 2))
pq.put(("c", 3))
print(pq.get())
--> ('a', 2)
from queue import PriorityQueue
pq = PriorityQueue()
pq.put((2, "a"))
pq.put((1, "b"))
pq.put((3, "c"))
print(pq.get())
--> (1, 'b')
若第一个值相同,则依次按第二、三个值排序
from queue import PriorityQueue
pq = PriorityQueue()
pq.put(("a", 2))
pq.put(("a", 1))
pq.put(("c", 3))
print(pq.get())
--> ('a', 1)
注: 若前N个值都相同,需确保第N + 1个值不同且可比较,若不可比较会报错。
保存类对象
当保存某个类的对象作为队列中元素时,可在类中通过 lt 函数控制元素之间的对比
class Dog:
def __init__(self, name, age):
self.name = name
self.age = age
def __lt__(self, other):
return self.age < other.age # age小的优先出队列
from queue import PriorityQueue
pq = PriorityQueue()
pq.put(Dog("a", 2))
pq.put(Dog("b", 1))
pq.put(Dog("c", 3))
p1 = pq.get()
p2 = pq.get()
print(p1.name, p1.age)
print(p2.name, p2.age)
--> b 1
--> a 2