Python学习记录04-查找最大或者最小的X个元素

2023-09-01 18:33:33 浏览数 (1)

在一个列表或者集合里,如果我们想要查找其中最大的值和最小的值。是比较简单的,我们可以使用min()函数和max()函数。如以下代码

代码语言:javascript复制
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个就可以。

代码语言:javascript复制
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个方法就不需要我们先自己排序了,因为它的底层会对传入的可迭代对象进行堆排序。排序之后最小的是元素是第一个,也就是说是从小到大排列。

代码语言:javascript复制
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参数的输出也是一致的。

代码语言:javascript复制
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 :给堆里加一个元素,并且把最小的弹出。

官方文档的这个堆排序的示例就很不错:

这节课的知识点总结:

  1. 若获取列表或者集合里的单个最大或者最小的值。min 和max函数较好
  2. 若获取列表或者集合里的X个最大或者最小的值。用heapq的2个方法较好
  3. 若X的值比较大或者接近列表的长度,可以使用sorted排序之后,再切片。 如果您觉得这篇文章对你有帮助,不妨给我点个赞,这将是我继续分享优质内容的动力。

0 人点赞