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使用cPickle模块序列化实例
Sep 25 Python
在Python中使用PIL模块对图片进行高斯模糊处理的教程
May 05 Python
python中defaultdict的用法详解
Jun 07 Python
Python单例模式的两种实现方法
Aug 14 Python
python中单例常用的几种实现方法总结
Oct 13 Python
Python3模拟登录操作实例分析
Mar 12 Python
Python叠加两幅栅格图像的实现方法
Jul 05 Python
python实现的按要求生成手机号功能示例
Oct 08 Python
python Pillow图像处理方法汇总
Oct 16 Python
python3.7通过thrift操作hbase的示例代码
Jan 14 Python
在pytorch中实现只让指定变量向后传播梯度
Feb 29 Python
python实现视频压缩功能
Dec 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
模仿OSO的论坛(一)
2006/10/09 PHP
收集的DedeCMS一些使用经验
2007/03/17 PHP
PHP对表单提交特殊字符的过滤和处理方法汇总
2014/02/18 PHP
取得传值的函数
2006/10/27 Javascript
javascript实现的在当前窗口中漂浮框的代码
2010/03/15 Javascript
js 点击按钮弹出另一页,选择值后,返回到当前页
2010/05/26 Javascript
A标签触发onclick事件而不跳转的多种解决方法
2013/06/27 Javascript
js实现日历可获得指定日期周数及星期几示例分享(js获取星期几)
2014/03/14 Javascript
javascript二维数组转置实例
2015/01/22 Javascript
JavaScript DOM进阶方法
2015/04/13 Javascript
jQuery ajax应用总结
2016/06/02 Javascript
手机端点击图片放大特效PhotoSwipe.js插件实现
2016/08/24 Javascript
JS实现AES加密并与PHP互通的方法分析
2017/04/19 Javascript
BootStrap的双日历时间控件使用
2017/07/25 Javascript
JS获取数组中出现次数最多及第二多元素的方法
2017/10/27 Javascript
基于jQuery的$.getScript方法去加载javaScript文档解析
2017/11/08 jQuery
Vue header组件开发详解
2018/01/26 Javascript
微信小程序实现购物页面左右联动
2019/02/15 Javascript
解决微信小程序中转换时间格式IOS不兼容的问题
2019/02/15 Javascript
vue实现分页加载效果
2019/12/24 Javascript
使用vue打包进行云服务器上传的问题
2020/03/02 Javascript
JS猜数字游戏实例讲解
2020/06/30 Javascript
[02:04]2018DOTA2亚洲邀请赛Secret赛前采访
2018/04/03 DOTA
在numpy矩阵中令小于0的元素改为0的实例
2019/01/26 Python
python已协程方式处理任务实现过程
2019/12/27 Python
Python namedtuple命名元组实现过程解析
2020/01/08 Python
python实现将两个文件夹合并至另一个文件夹(制作数据集)
2020/04/03 Python
浅谈在JupyterNotebook下导入自己的模块的问题
2020/04/16 Python
时尚的CSS3进度条效果
2012/02/22 HTML / CSS
合作投资意向书
2014/04/01 职场文书
企业负责人任命书
2014/06/05 职场文书
公司收款委托书范本
2014/09/20 职场文书
教师创先争优承诺书
2015/04/27 职场文书
盘点2020年适合农村地区创业的项目
2019/10/16 职场文书
golang三种设计模式之简单工厂、方法工厂和抽象工厂
2022/04/10 Golang
Python按顺序遍历并读取文件夹中文件
2022/04/29 Python