1. 程式人生 > >Python標準庫: 優先順序佇列

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