每日python—— 1.4 python中的堆排序模块heapq

Posted 咋家

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日python—— 1.4 python中的堆排序模块heapq相关的知识,希望对你有一定的参考价值。

第七十章    吾言甚易知,甚易行。天下莫能知,莫能行。言有宗,事有君,夫唯无知,是以不我知。知我者希,则我者贵。是以圣人被褐而怀玉。


python中的heapq模块提供了与堆排序有关的操作,关于堆的理解可以自行网上搜索相关知识,需要清楚的是,python中的堆是以最小堆为基础的,因此相应的pop操作,会弹出其中的最小元素,下面来看这个模块提供的一些方法。


首先,如何创建一个堆,一般会根据一个列表初始化创建一个堆,这需要函数heapify()来完成,对于空列表我们可以直接将其按照堆来对待进行相应操作,非空列表必须进行相应的创建操作。

>>> from heapq import *>>> h =[5,4,3,2,1]>>> heapify(h)>>> h[1, 2, 3, 5, 4]

heappush(heap, item)

将值item压入堆中

>>> heappush(h, 6)>>> h[1, 2, 3, 5, 4, 6]

heappop(heap)

返回堆中最小值

>>> heappop(h)1>>> h[2, 4, 3, 5, 6]

heappushpop(heap, item)

先将值item压入堆中,再返回堆中最小值

>>> heappushpop(h, 7)2>>> h[3, 4, 7, 5, 6]

heapreplace(heap, item)

与上面的相反先进行pop操作,然后进行push操作

>>> heapreplace(h, 8)3>>> h[4, 5, 7, 8, 6]

merge(*iterable)

将多个有序列表合并成一个有序列表,类似与归并排序,切记得是有序列表

>>> a =[1,3,5]>>> b =[2,4,6]>>> list(merge(a,b))[1, 2, 3, 4, 5, 6]

nlargest(n, iterable[, key]), nsmallest(n, iterable[,key])

获取列表中最大最小的n个值,key值可以指定特定的关键词排序

portfolio = [ {'name': 'IBM', 'shares': 100, 'price': 91.1}, {'name': 'AAPL', 'shares': 50, 'price': 543.22}, {'name': 'FB', 'shares': 200, 'price': 21.09}, {'name': 'HPQ', 'shares': 35, 'price': 31.75}, {'name': 'YHOO', 'shares': 45, 'price': 16.35}, {'name': 'ACME', 'shares': 75, 'price': 115.65}]cheap = heapq.nsmallest(3, portfolio, key=lambda s: s['price'])expensive = heapq.nlargest(3, portfolio, key=lambda s: s['price'])


以上是关于每日python—— 1.4 python中的堆排序模块heapq的主要内容,如果未能解决你的问题,请参考以下文章

python中的堆顺序

python code practice: 快排归并堆排的实现,双指针/滑动窗口技术

Python:在优先队列实现中使用我的堆

每日一读:《关于python2和python3中的range》

Python堆排序之heapq

每日一记----python中的列表查询和插入