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

在一个列表或者集合里,如果我们想要查找其中最大的值和最小的值。是比较简单的,我们可以使用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 :给堆里加一个元素,并且把最小的弹出。

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

这节课的知识点总结:

  1. 若获取列表或者集合里的单个最大或者最小的值。min 和max函数较好
  2. 若获取列表或者集合里的X个最大或者最小的值。用heapq的2个方法较好
  3. 若X的值比较大或者接近列表的长度,可以使用sorted排序之后,再切片。

    如果您觉得这篇文章对你有帮助,不妨给我点个赞,这将是我继续分享优质内容的动力。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇