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