heapq库(Python)

85 阅读1分钟

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