使用Python模块:heapq模块(堆)

这是一个相当实用的内置模块,但是很多人竟然不知道他的存在——笔者也是今天偶然看到的,哎……尽管如此,还是改变不了这个模块好用的事实


概述

首先明确,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(…)

nlargest(..)nsmallest(..)函数接受两个参数,第一个是前n大/小的n的具体值,第二个是可迭代序列(列表、元组、字符串)

下面让我们看看它的具体用法,在终端敲

>>> help(heapq.nlargest)

输出

使用Python模块:heapq模块(堆)_第1张图片

OMG,原来如此……(读者想必也恍然大悟状,那个函数其实是封装了文章开头的那个经典求n个最大/小元素的方法,嘿嘿

再提一点,就是参数中的key(也是从sorted(..)函数那里借来的,嘿嘿),是用来选择关键字排序的,举个例子就秒懂

为了形式美,我用idle拍照出来

使用Python模块:heapq模块(堆)_第2张图片

使用Python模块:heapq模块(堆)_第3张图片

当然你大可以坚持用老经典方法求最大/小的前n个数,但是使用heapq模块的话会让你的代码更优雅(Maybe ?,要不然Python没事整这个内置函数干啥?!当然是拿来用的咯


从堆的角度看heapq

都说了heapq擅长求前n最大/小的元素,那是堆的性质(heap……q)

使用Python模块:heapq模块(堆)_第4张图片

Python的heapq默认是小根堆(如上图,每个节点都不大于其孩子节点)

heappush(treelist, item)将新元素添加heaplist列表中

使用Python模块:heapq模块(堆)_第5张图片

heappop(heap)每次从heap堆中弹出堆顶元素

使用Python模块:heapq模块(堆)_第6张图片

heappushpop(heap, item)等于先push(heap, item)heappop(heap),但是比分别调用二者要快

heapreplace(heap, item)等于先heappop(heap)heappush(heap, item),但是比分别调用二者要快

heapify(treelist):将列表treelist进行堆调整,默认的是小根堆

heapq.merge(*heap):将多个列表合并,并进行堆调整,返回的是合并后的列表的迭代器

你可能感兴趣的:(Python,语言)