1. 程式人生 > 其它 >優先佇列(堆)函式heapq常用方法總結

優先佇列(堆)函式heapq常用方法總結

技術標籤:演算法與資料結構演算法python佇列

演算法題中有時會用到優先佇列來去前n大或者前n小的資料,這個時候就可以記住堆這種資料結構,python中優先佇列是使用heapq這個庫實現的,下面就將這個庫的常用方法進行介紹

匯入庫

>>> list = [2,3,4,5,1,6,9,8]
>>> import heapq

將列表生成小頂堆(python預設生成的是小頂堆)

>>> heapq.heapify(list)
>>> list
[1, 2, 4, 5, 3, 6, 9, 8]

刪除頂堆元素

>>
> heapq.heappop(list) 1

新增元素到堆裡

>>> heapq.heappush(list,3)
>>> list
[2, 3, 4, 3, 8, 6, 9, 5]

刪除頂堆元素和新增新元素進去同時進行

>>> heapq.heappushpop(list,100)
2
>>> list
[3, 3, 4, 5, 8, 6, 9, 100]

或者:

>>> heapq.heappushpop(list,100)
2
>>> list
[3, 3, 4, 5, 8, 6
, 9, 100]

將兩個列表合併成一個迭代器

>>> l1 = [2,3,4,1,7]
>>> l2 = [100,3,56,78]
>>> heapq.merge(l1,l2)
<generator object merge at 0x00000227FA9194C0>
>>> h = heapq.merge(l1,l2)
>>> list(h)
[2, 3, 4, 1, 7, 100, 3, 56, 78] 
#不是嚴格的排序,而是用第一個列表的元素與第二個列表的元素比較,將小的放在前面,然後較大的和另一個列表的第二個元素繼續比較,這樣重複下去

輸出佇列中前n大的數值

>>> h = heapq.merge(l1,l2)
>>> list(h)
[2, 3, 4, 1, 7, 100, 3, 56, 78]

更高階的例子

import heapq
l3 = [
    {"name":"yao","age":23,"slary":20000},
    {"name":"xiao","age":25,"slary":25000},
    {"name":"feng","age":28,"slary":30000}
]

res = heapq.nlargest(2,l3,lambda s:s["slary"])
print(res)
[{'name': 'feng', 'age': 28, 'slary': 30000}, {'name': 'xiao', 'age': 25, 'slary': 25000}]