Python实现从N个数中找到最大的K个数


Posted in Python onApril 02, 2020

提出问题:

如何在某集合里面找出最大或最小的K个元素。

解决思路:

找出最大或最下的K个元素,可以使用Python库中的heapq模块,该模块提供两个函数nlargest()求最大K个和nsmallest()求最小K个。

下面我们举例说明:

import heapq

nums=[12,-9,-3,32,9,56,23,0,11,34]
print(heapq.nlargest(4,nums)) #-->最大的4个
print(heapq.nsmallest(4,nums)) #-->最小的4个

运行结果:

[56, 34, 32, 23]
[-9, -3, 0, 9]

分析下,nlargest()和nsmallest()函数有两个参数,第一个参数是求最大或最下的K个元素,第二个参数是待查询的集合。除此之外,他们也可以接受一个参数key,这使得他们处理更加复杂的数据结构。例如:

import heapq
portfolio = [
{'name': 'IBM', 'shares': 100, 'price': 91.1},
{'name': 'AAPL', 'shares': 50, 'price': 543.22},
{'name': 'FB', 'shares': 200, 'price': 21.09},
{'name': 'HPQ', 'shares': 35, 'price': 31.75},
{'name': 'YHOO', 'shares': 45, 'price': 16.35},
{'name': 'ACME', 'shares': 75, 'price': 115.65}
]

cheap = heapq.nsmallest(3, portfolio, key=lambda s: s['price'])
print(cheap)
expensive = heapq.nlargest(3, portfolio, key=lambda s: s['price'])
print(expensive)

运行结果:

[{'name': 'YHOO', 'shares': 45, 'price': 16.35}, {'name': 'FB', 'shares': 200, 'price': 21.09}, {'name': 'HPQ', 'shares': 35, 'price': 31.75}]
[{'name': 'AAPL', 'shares': 50, 'price': 543.22}, {'name': 'ACME', 'shares': 75, 'price': 115.65}, {'name': 'IBM', 'shares': 100, 'price': 91.1}]

深入讨论:

假如说,我们正在寻找某集合中最大或最下的K个元素,并且N的数值很小,如果再使用上面的方法,可能就不是最好的选择。那么,我们介绍heapify()函数,这个函数首先会在底层将数据转换成列表,并且元素会以堆的顺序排列。举例:

Python实现从N个数中找到最大的K个数

从上面的代码中,我们看出元素确实是以堆的顺序排列的,同时堆hea_num[0]对应的元素-9总是最小的。在heapq()模块中还提供heappop()函数,该方法会把第一个元素(最小的)给弹出来,然后第二小的元素会自动补位,它的操作时间复杂度是O(log N),其中N代表的是堆的大小。

具体的操作看下面的代码:

Python实现从N个数中找到最大的K个数

总结一下:

当要查找的元素数量比较少的时,适合使用nlargest()和nsmallest()

当只查找集合中最大或最小的1个元素时,推荐使用min()和max()

当N和集合本身大小差不多时,应该是先对集合排序,然后做切片操作(比如:sorted(items)[:N]或sorted(items)[-N:])

补充知识:python三个数从小到大排序

Python实现从N个数中找到最大的K个数

python三个数从小到大排序

1、首先定义一个函数paiLie();然后在paiLie函数内使用for循环和input获取三个数字并存入列表;最后调用列表的sort()方法进行排序即可。

def paiLie():
 result = []
 for i in range(3):
  x = input("请输入数字:")
  result.append(x)
 result.sort()
 print result

2、调用

paiLie()
请输入数字:56
请输入数字:5
请输入数字:89

运行结果:

[5, 56, 89]

以上这篇Python实现从N个数中找到最大的K个数就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现按学生年龄排序的实际问题详解
Aug 29 Python
python爬虫之xpath的基本使用详解
Apr 18 Python
Python简单爬虫导出CSV文件的实例讲解
Jul 06 Python
对python实现二维函数高次拟合的示例详解
Dec 29 Python
Django REST framework 如何实现内置访问频率控制
Jul 23 Python
python3格式化字符串 f-string的高级用法(推荐)
Mar 04 Python
Django import export实现数据库导入导出方式
Apr 03 Python
python实现猜数游戏(保存游戏记录)
Jun 22 Python
树莓派4B安装Tensorflow的方法步骤
Jul 16 Python
mac安装python3后使用pip和pip3的区别说明
Sep 01 Python
Python通过队列来实现进程间通信的示例
Oct 14 Python
python中用Scrapy实现定时爬虫的实例讲解
Jan 18 Python
Python任务调度利器之APScheduler详解
Apr 02 #Python
PyQt使用QPropertyAnimation开发简单动画
Apr 02 #Python
python topk()函数求最大和最小值实例
Apr 02 #Python
python使用梯度下降和牛顿法寻找Rosenbrock函数最小值实例
Apr 02 #Python
Python如何通过百度翻译API实现翻译功能
Apr 02 #Python
Python基于百度AI实现OCR文字识别
Apr 02 #Python
python 穷举指定长度的密码例子
Apr 02 #Python
You might like
Laravel 的数据库迁移的方法
2017/07/31 PHP
最简单的jQuery程序 入门者学习
2009/07/09 Javascript
改变隐藏的input中value值的方法
2014/03/19 Javascript
jQuery实现简单网页遮罩层/弹出层效果兼容IE6、IE7
2014/06/16 Javascript
jQuery实现TAB选项卡切换特效简单演示
2016/03/04 Javascript
jQuery实现百叶窗焦点图动画效果代码分享(附源码下载)
2016/03/14 Javascript
javascript删除html标签函数cIsHTML
2017/01/09 Javascript
js判断手机号是否正确并返回的实现代码
2017/01/17 Javascript
jQuery 全选 全不选 事件绑定的实现代码
2017/01/23 Javascript
微信小程序教程系列之设置标题栏和导航栏(7)
2020/06/29 Javascript
解决浏览器会自动填充密码的问题
2017/04/28 Javascript
vue.js的安装方法
2017/05/12 Javascript
Javascript之图片的延迟加载的实例详解
2017/07/24 Javascript
JavaScript模拟实现封装的三种方式及写法区别
2017/10/27 Javascript
使用axios请求时,发送formData请求的示例
2019/10/29 Javascript
node.js基础知识汇总
2020/08/25 Javascript
vue监听浏览器原生返回按钮,进行路由转跳操作
2020/09/09 Javascript
JavaScript 判断数据类型的4种方法
2020/09/11 Javascript
nuxt.js写项目时增加错误提示页面操作
2020/11/05 Javascript
[57:12]完美世界DOTA2联赛循环赛 Inki vs Matador BO2第一场 10.31
2020/11/02 DOTA
[39:08]完美世界DOTA2联赛PWL S3 LBZS vs CPG 第一场 12.12
2020/12/16 DOTA
浅谈Tensorflow由于版本问题出现的几种错误及解决方法
2018/06/13 Python
Python爬取数据并写入MySQL数据库的实例
2018/06/21 Python
详解python3中的真值测试
2018/08/13 Python
python使用Paramiko模块实现远程文件拷贝
2019/04/30 Python
OpenCV中VideoCapture类的使用详解
2020/02/14 Python
Swisse官方海外旗舰店:澳大利亚销量领先,自然健康品牌
2017/12/15 全球购物
阿迪达斯荷兰官方网站:adidas荷兰
2018/03/16 全球购物
Java提供了哪些企业应用编程接口
2015/02/13 面试题
战友聚会邀请函
2014/01/18 职场文书
珍珠鸟教学反思
2014/02/01 职场文书
党的群众路线教育实践活动剖析材料
2014/09/30 职场文书
英文升职感谢信
2015/01/23 职场文书
Mybatis-plus在项目中的简单应用
2021/07/01 Java/Android
MySQL令人大跌眼镜的隐式转换
2021/08/23 MySQL
mysql中关键词exists的用法实例详解
2022/06/10 MySQL