heapq
import heapq
heap = [] #创建了一个空堆
heappush(heap,item) #往堆中插入一条新的值
item = heappop(heap) #从堆中弹出最小值
item = heap[0] #查看堆中最小值,不弹出
heapify(x) #以线性时间讲一个列表转化为堆
item = heapreplace(heap,item) #弹出并返回最小值,然后将heapqreplace方法中item的值插入到堆中,堆的整体结构不会发生改变。这里需要考虑到的情况就是如果弹出的值大于item的时候我们可能就需要添加条件来满足function的要求
if item > heap[0]
item = heapreplace(heap, item)
heappushpop() #顾名思义,将值插入到堆中同时弹出堆中的最小值。
merge(*iterables) #合并多个堆然后输出
>>>list(merge([1,3,5,7],[0,2,4,8],[5,10,15,20],[],[25]))
[0, 1, 2, 3, 4, 5, 5, 7, 8, 10, 15, 20, 25]
nlargest(n , iterbale, key=None)
从堆中找出做大的N个数,key的作用和sorted( )方法里面的key类似,用列表元素的某个属性和函数作为关键字。
>>>a = [0, 1, 2, 3, 4, 5, 5, 7, 8, 10, 15, 20, 25]
>>>heapq.nlargest(5,a)
[25, 20, 15, 10, 8]
这样就返回了列表中前五个最大的数。
>>>b = [('a',1),('b',2),('c',3),('d',4),('e',5)]
>>>heapq.nlargest(1,b,key=lambda x:x[1])
[('e', 5)]
加入key之后的使用方法。
nsmallest(n, iterable, key=None) #找到堆中最小的N个数用法同上。
注意:在官方给出来的文档中写道使用复合操作方法会比使用单行为操作方法会更快一些。例如使用heappushpop( )方法会比先使用heappush( )再使用heappop( )这两单个方法效率来说会更高。
例子
在上篇文章中讲到的堆排序如果用到heapq模块就会变得非常好写。首先我们只需要建立一个空堆然后将数导入堆中,再进行弹出操作这样就形成了一个堆排序。
def heapsort(iterable):
h = []
for value in iterable:
heapq.heappush(h,value) #[0, 1, 2, 6, 3, 5, 4, 7, 8, 9]
return [heapq.heappop(h) for i in range(len(h))]
print heapsort([1,3,5,7,9,2,4,6,8,0])
在heappush方法的时候heapq就自动给你建立好了一个堆。当然如果对于已有的列表转换成堆也好办,heapq给我们提供了heapify( )方法。
def HeapSort(list):
heapq.heapify(list)
heap = []
while list:
heap.append(heapq.heappop(list))
list[:] = heap
return list
print HeapSort([1,3,5,7,9,2,4,6,8,0])
当然单个的数列明显不是堆的正常要求,我们可以使用数组的形式来筛选出我们想要的值。这样的话我们能够快速的对字典中我们想要的值做查找,利用刚刚我们讲到的nlargest和nsmallest。
>>> h = []
>>> heappush(h, (5, 'write code'))
>>> heappush(h, (7, 'release product'))
>>> heappush(h, (1, 'write spec'))
>>> heappush(h, (3, 'create tests'))
>>> heappop(h)
(1, 'write spec')