heapq库的介绍
Python的heapq库是一个实现了堆队列算法(也称为优先队列算法)的模块。它提供了对堆数据结构的高效操作,包括插入元素、删除最小元素等。
heapq库的基本操作
向堆中插入元素(heappush)
heap = []
heapq.heappush(heap, 3)
heapq.heappush(heap, 1)
heapq.heappush(heap, 5)
heapq.heappush(heap, 2)
print(heap) # 输出:[1, 2, 5, 3]
从堆中弹出最小元素
min_element = heapq.heappop(heap)
print(min_element) # 输出:1
print(heap) # 输出:[2, 3, 5]
将列表转换为堆
lst = [3, 1, 5, 2]
heapq.heapify(lst)
print(lst) # 输出:[1, 2, 5, 3]
弹出堆中最小元素,然后将新元素推入堆中
old_min = heapq.heapreplace(heap, 6) # heap为[2, 3, 5]
print(old_min) # 输出:2
print(heap) # 输出:[3, 6, 5]
获取堆中最大的n个元素
largest_n = heapq.nlargest(3, heap) # heap为[1, 2, 5, 3]
print(largest_n) # 输出:[5, 3, 2]
获取堆中最小的n个元素
smallest_n = heapq.nsmallest(2, heap) # heap为[1, 2, 5, 3]
print(smallest_n) # 输出:[1, 2]
合并多个已排序的输入序列,并返回一个迭代器,该迭代器按升序生成合并后的元素
iterables = [[1, 3, 5], [2, 4, 6]]
merged = list(heapq.merge(*iterables))
print(merged) # 输出:[1, 2, 3, 4, 5, 6]
使用小技巧
heapq这个库中的heappop方法只适用于弹出最小元素,如果你需要动态相反的方法,请对数据进行处理。
lst = [1, 2, 3, 4, 5]
lstOp = [-1, -2, -3, -4, -5] # lstOp = [-item for item in lst]
heapq.heapify(lstOp)
max_element = -heapq.heappop(lstOp)
print(max_element) # 输出5