優先佇列(堆)函式heapq常用方法總結
阿新 • • 發佈:2020-12-31
演算法題中有時會用到優先佇列來去前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}]