Python标准库: 优先级队列

python中元组比较大小

从第一个元素开始比较,如果不等则将第一个元素的比较结果作为整个元组的比较结果;

如果相等则寻找下一个元素重复上述比较过程

>>> (2,3,4)<(3,4)
True
>>> (2,3,4)<(2,3,5)
True
>>> (2,3,4)<(2,3,1)
False

优先队列

优先队列内部默认实现的是小根堆,具有的操作主要有:

向队列中添加元素 Queue.put(obj),每添加一个元素优先队列内部就会进行调整成最小堆;

从队列中获取元素 Queue.get(),每取出一个元素队列内部就会进行调整; 

队列判空 Queue.empty()

队列大小 Queue.qsize()

队列存储的元素是数字:

>>> from queue import PriorityQueue
>>> q = PriorityQueue()
>>> q.put(1)
>>> q.put(2)
>>> q.put(3)
>>> while not q.empty():
...     print(q.get())
... 
1
2
3

队列存储的元素是元组:

>>> q = PriorityQueue()
>>> q.put((1, "as"))
>>> q.put((3, "aas"))
>>> q.put((2, "zx"))
>>> q.get()
(1, 'as')
>>> q.get()
(2, 'zx')
>>> q.get()
(3, 'aas')
>>> q.get()

队列存储的元素是自己编写的类:

from queue import PriorityQueue

class comobj():
    def __init__(self, key, name, sex):
        # 优先级
        self.key = key 
        # 具体的属性值,可以用类封装起来
        self.name = name 
        self.sex = sex
        
    def __lt__(self, other):# 这里的比较规则是:先根据key的大小判断,如果key相等则根据name判断
        # 最后都形成小根堆
        if self.key < other.key:
            return True
        elif self.key > other.key:
            return False
        else:
            return self.name < other.name
        
    def __str__(self):
        return str(self.key) + " " + self.name + " " + self.sex

print("test1:")
q = PriorityQueue()
q.put(comobj(10, "zhu", "male"))
q.put(comobj(1, "zu", "male"))
q.put(comobj(12, "zh", "female"))
print(q.get())
print(q.get())
print(q.get())
print()
print("test2:")
q = PriorityQueue()
q.put(comobj(10, "zhu", "male"))
q.put(comobj(1, "zu", "male"))
q.put(comobj(12, "zh", "female"))
q.put(comobj(12, "zi", "female"))
print(q.get())
print(q.get())
print(q.get())
print(q.get())
"""输出结果:
test1:
1 zu male
10 zhu male
12 zh female

test2:
1 zu male
10 zhu male
12 zh female
12 zi female

"""

参考:

1. https://zhuanlan.zhihu.com/p/37637660

2. https://blog.csdn.net/lanchunhui/article/details/52316973

3. https://blog.csdn.net/liu2012huan/article/details/53264162

4. https://python.freelycode.com/contribution/detail/806

猜你喜欢

转载自blog.csdn.net/Ahead_J/article/details/85005925