查找多个最大或者最小元素

对于一组数让我们找到最大最小元素是不陌生的问题

>>> a = [1,5,3,9,4,6,2]
>>> max(a)
9
>>> min(a)
1

但是如何能够找到多个最大值呢,如果是有序表,可以通过切片的方法找到,当然如果是无序表,也可以先排序,在切片。在python中有模块可以直接解决这个问题:heapq模块
heapq模块中有两个函数:nlargest与nsmallest可以完美地解决这个问题
我们试着找一找前三个最大的数与后两个最小的数:

>>> import heapq
>>> heapq.nlargest(3,a)
[9, 6, 5]
>>> heapq.nsmallest(2,a)
[1, 2]

两个函数都能够接受一个关键字参数,用于更复杂的数据结构中:

>>> menu = [{'name':'红烧排骨','price':53},{'name':'糖醋鱼','price':46},{'name':'锅包肉','price':33},{'name':'鱼香肉丝','price':28},{'name':'干锅土豆片','price':22},{'name':'麻辣小龙虾','price':78}]
>>> cheap = heapq.nsmallest(3,menu,key = lambda s:s['price'])
>>> cheap
[{'name': '干锅土豆片', 'price': 22}, {'name': '鱼香肉丝', 'price': 28}, {'name': '锅包肉', 'price': 33}]
>>> expensive = heapq.nlargest(2,menu,key = lambda s:s['price'])
>>> expensive
[{'name': '麻辣小龙虾', 'price': 78}, {'name': '红烧排骨', 'price': 53}]

那么我们来探究一下这个模块,这个模块主要用于实现堆数据结构的,堆就是用数组表示的二叉树,分为大根堆与小根堆,大根堆中它的父节点一定比子节点的数据大,但是兄弟节点没有大小比较。
heapq 模块中的函数:

函数 应用 时间复杂度
heapq.heappush(heap,item) 往堆中添加新值 O(logn)
heapq.heappop(heap) 从堆中弹出并返回最小值 O(logn)
heapq.heapify(list) 将列表转换为堆 O(n)
heapq.heapreplace(heap,item) 先删除并返回最小元素的值,在添加新元素
heapq.heappushpop(heap,item) 判断添加元素与堆的第一个元素值对比,如果大,则删除并返回第一个元素,然后添加新元素item,否则,返回item,原堆不变
heapq.merge(*iterables) 合并多个堆然后输出
heapq.nlargest() 返回n个最大值 O(nlogt)
heapq.nsmallest() 返回n个最小值 O(nlogt)

你可能感兴趣的:(查找多个最大或者最小元素)