优先队列(堆)函数heapq常用方法总结

算法题中有时会用到优先队列来去前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}]

猜你喜欢

转载自blog.csdn.net/a18829292719/article/details/111953275
今日推荐