在一个列表或者集合里,如果我们想要查找其中最大的值和最小的值。是比较简单的,我们可以使用min()函数和max()函数。如以下代码
tlist = [1,20,-4,100]
print("最大值:", max(tlist), "最小值:", min(tlist)) #最大值: 100 最小值: -4
tset = {99,-1,132}
print("最大值:", max(tset), "最小值:", min(tset)) #最大值: 132 最小值: -1
那假如要查找这个列表或者集合里的最大的2个元素或者是最小的2个元素,此时应该怎么做呢
常规思路:把列表或者集合排序。然后获取有序列表(假设从小到大)的前2个和后2个就可以。
tlist = [1,20,-4,100]
print(sorted(tlist)[:2]) #[-4, 1]
print(sorted(tlist)[-2:]) #[20, 100]
到此本节内容的知识点来了,像类似的问题可以使用heapq模块来解决。我们来先打开官方的api文档查看介绍,只看最关键的2个方法就可以,一个是从数据集中返回n个最大的,一个是返回n个最小的。 https://docs.python.org/zh-cn/3/library/heapq.html
然后我们体验一下。发现使用这个heapq的2个方法就不需要我们先自己排序了,因为它的底层会对传入的可迭代对象进行堆排序。排序之后最小的是元素是第一个,也就是说是从小到大排列。
import heapq
tlist = [1322,1,20,-4,100,0]
print(heapq.nlargest(2,tlist)) #最大的2个数,未指定key [1322, 100]
print(heapq.nsmallest(2,tlist)) #最小的2个数,未指定key [-4, 0]
tset = {99,-1,132}
print(heapq.nlargest(2,tset)) #最大的2个数,未指定key [132, 99]
print(heapq.nsmallest(2,tset)) #最小的2个数,未指定key [-1, 99]
这里说一下这2个方法的3个参数
- n:指的是返回的元素个数
- iterable :指的是可迭代的对象,其中包括列表,集合等
-
key:对应要排序的键 ,等价于 sorted的key参数
以下代码我们通过指定key,使得按照年龄来排序。也可以看出来当heapq的返回数量和长度一致时候,输出和sorted加key参数的输出也是一致的。
students=[ ('hxd1',18), ('hxd100',14), ('hxd10086',15), ] big =heapq.nlargest(1,students,key=lambda s:s[1]) print(big) #[('hxd1', 18)] small =heapq.nsmallest(3,students,key=lambda s:s[1]) print(small) #[('hxd100', 14), ('hxd10086', 15), ('hxd1', 18)] test3 = sorted(students,key=lambda s:s[1]) #可以看到和heapq的key参数作用是一样的,输出也一样 print(test3) #[('hxd100', 14), ('hxd10086', 15), ('hxd1', 18)]
heapq还有3个比较常用的函数,分别是heappush和heappop和heappushpop 。
- heappush :给堆里加元素
- heappop :把堆里最小的元素弹出
- heappushpop :给堆里加一个元素,并且把最小的弹出。
官方文档的这个堆排序的示例就很不错:
这节课的知识点总结:
- 若获取列表或者集合里的单个最大或者最小的值。min 和max函数较好
- 若获取列表或者集合里的X个最大或者最小的值。用heapq的2个方法较好
-
若X的值比较大或者接近列表的长度,可以使用sorted排序之后,再切片。
如果您觉得这篇文章对你有帮助,不妨给我点个赞,这将是我继续分享优质内容的动力。