这是一个相当实用的内置模块,但是很多人竟然不知道他的存在——笔者也是今天偶然看到的,哎……尽管如此,还是改变不了这个模块好用的事实
首先明确,heapq
模块是可以用来求前n个最大/最小值的(怎么样,是不是很常见的应用场景 :-)
通常在Python中,求前n个最大/最小值的方法无非是通过排序,它通常和列表相联系
lyst = [-3, 22, 45, 34, 99, 102, -44]
low3 = sorted(lyst)[:3]
top3 = sorted(lyst, reverse=True)[:3]
在导入heapq
模块后,就可以不动头脑直接求出最大/最小的n个元素(还等什么?赶紧爽一把: -)
import heapq
lyst = [-3, 22, 45, 34, 99, 102, -44]
low3 = heapq.nlargest(3, lyst)
top3 = heapq.nsmallest(3, lyst)
我就说一句,heapq.nlargest(..)
、heapq.nsmallest(..)
返回的是列表(便于修改嘛)
nlargest(..)
、nsmallest(..)
函数接受两个参数,第一个是前n大/小的n的具体值,第二个是可迭代序列(列表、元组、字符串)
下面让我们看看它的具体用法,在终端敲
>>> help(heapq.nlargest)
输出
OMG,原来如此……(读者想必也恍然大悟状,那个函数其实是封装了文章开头的那个经典求n个最大/小元素的方法,嘿嘿
再提一点,就是参数中的key
(也是从sorted(..)
函数那里借来的,嘿嘿),是用来选择关键字排序的,举个例子就秒懂
为了形式美,我用idle拍照出来
当然你大可以坚持用老经典方法求最大/小的前n个数,但是使用heapq
模块的话会让你的代码更优雅(Maybe ?,要不然Python没事整这个内置函数干啥?!当然是拿来用的咯
都说了heapq
擅长求前n最大/小的元素,那是堆的性质(heap……q)
Python的heapq默认是小根堆(如上图,每个节点都不大于其孩子节点)
heappush(treelist, item)
将新元素添加heaplist列表中
heappop(heap)
每次从heap堆中弹出堆顶元素
heappushpop(heap, item)
等于先push(heap, item)
再heappop(heap)
,但是比分别调用二者要快
heapreplace(heap, item)
等于先heappop(heap)
再heappush(heap, item)
,但是比分别调用二者要快
heapify(treelist)
:将列表treelist进行堆调整,默认的是小根堆
heapq.merge(*heap)
:将多个列表合并,并进行堆调整,返回的是合并后的列表的迭代器