python 如何在list中找Topk的数值和索引


Posted in Python onMay 20, 2021

需求:

对于一个python list 或者numpy数组,我需要找到这个list中最大的K个数及其对应的下标。

解决方式:

1. 可以构造字典通过排序解决,不过代码量较多。

2. 使用heapq库,可以直接获取最大值的下标和数值。

import heapq
a = [4,2,6,1,9,9]
 
# 获取下标, 输出为[4, 5, 2]
heapq.nlargest(3, range(len(a)), a.__getitem__)
 
# 获取数值, 输出为[9, 9, 6]
heapq.nlargest(3,a)

如果要取最小的数,使用 nsmallest即可

补充:Python 利用中间值求TopK 算法

算法思想

首先我们要思考,我要做什么?解决什么问题?

TopK问题,找出一组数据中的前K个最大值或者最小值,这个数据是否重复?要做去重处理?

ok 我们明确我们做什么了 ,那介绍的python处理的topK 算法过程是怎么样的呢?

如果用排序那就没必要引入topK 了,当数据强大的时候选取TopK 可以省略很多排序的计算,至于有多优化自己去思考下,就比如排列组合的C,A的区别,一个是抽取,一个是抽取并排列…

以下以找出TopK 的最大值为例,最小值的可以自己修改一下下就可以

介绍的算法思想是利用中间值,将数列分为三部分 ,

【比中间值大的列表】,中间值,【比中间值小的列表】

那么我们当比较

【比中间值大的列表】的个数 == k

的时候就可以得出前K个最大值了,因此

重点就是找出这个中间值

如何找出中间值

以列表的第一个数开始为中间值,拆分为三部分

if 【比中间值大的列表】的个数 == k:return 中间值 #程序出口,结束。

if 【比中间值大的列表】的个数 < k :

·····继续在【比中间值小的列表】找

·····K - 【比中间值大的列表】的个数 -1 个数

(为什么要减一,1是前一次的中间值,分的三部分,前部分后部分都没有包含中间值,因此…)

if 【比中间值大的列表】的个数 > k :

…也就是说比中间值大的列表比K还大,那就在这个列表中继续找就行

结合代码和注释看

如果要找最小值,只需要改一下就ok ,还可以设置一个布尔值的输入,来做前K个最大值最小值

 

#2019 11 04
#author 半斤地瓜烧
#TopK 算法,找出序列中前K个最大值的
#输入一个seq
# 输出以seq[0]为中间值 划分的三个部分,中间值,比这个值大的seq ,比这个值小的seq,
# 即splitNum,theBig,theSmall
def Split_Seq(seq):
    splitNum = seq[0]
    seq = seq[1:]#两个部分都不包含中间值,因此切片去除seq[0]
    theBig = [x for x in seq if x >= splitNum]
    theSmall = [x for x in seq if x < splitNum]
    return splitNum,theBig,theSmall
#找出中间值
def topKNum(seq,k):
    splitNum, theBig, theSmall = Split_Seq(seq)
    theBigLen = len(theBig)
    
    if  k == theBigLen:
        return splitNum#出口,返回这个中间值,
    # 为什么不直接返回thebig?因为存在递归的原因thebig 不是在初始的seq找出来的
    #需要重新Split,即可,读者自己思考
    # 大值的列表中还未够K个数的情况,
    if k > theBigLen:
        return topKNum(theSmall,k-theBigLen-1)
    # 大值的列表中大于K个数的情况
    return topKNum(theBig,k)
#由中间值找出TopK个值,<list>
def getTopK(seq,k):
    
    return [i for i in seq if i > topKNum(seq, k)]
if __name__ == '__main__':
    alist = [7, 3, 5, 1,885,234,2211,222,22, 2, 11, 2, 115]
    print("===为了验证,引入排序观看===", sorted(alist,reverse= True))
    print(getTopK(alist, 3))

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中itertools模块用法详解
Sep 25 Python
Python基于tkinter模块实现的改名小工具示例
Jul 27 Python
python简单商城购物车实例代码
Mar 15 Python
基于python log取对数详解
Jun 08 Python
浅析Python函数式编程
Oct 06 Python
python读取目录下最新的文件夹方法
Dec 24 Python
Python OS模块实例详解
Apr 15 Python
python 安装教程之Pycharm安装及配置字体主题,换行,自动更新
Mar 13 Python
python能自学吗
Jun 18 Python
python实现发送带附件的邮件代码分享
Sep 22 Python
python3处理word文档实例分析
Dec 01 Python
总结Pyinstaller打包的高级用法
Jun 28 Python
Requests什么的通通爬不了的Python超强反爬虫方案!
python使用glob检索文件的操作
python opencv通过按键采集图片源码
python 如何执行控制台命令与操作剪切板
教你怎么用Python生成九宫格照片
用 Python 元类的特性实现 ORM 框架
May 19 #Python
浅谈Python 中的复数问题
May 19 #Python
You might like
php实现ping
2006/10/09 PHP
浏览器预览PHP文件时顶部出现空白影响布局分析原因及解决办法
2013/01/11 PHP
Laravel 5框架学习之表单
2015/04/08 PHP
两种简单实现菜单高亮显示的JS类代码
2010/06/27 Javascript
ASP.NET中AJAX 调用实例代码
2012/05/03 Javascript
运算符&amp;&amp;的三个不同层次
2013/04/07 Javascript
JavaScript中的prototype和constructor简明总结
2014/04/05 Javascript
jQuery鼠标事件汇总
2015/08/30 Javascript
Hallo.js基于jQuery UI所见即所得的Web编辑器
2016/01/26 Javascript
基于JQuery打造无缝滚动新闻步骤详解
2016/03/31 Javascript
详谈angularjs中路由页面强制更新的问题
2017/04/24 Javascript
解决vue的变量在settimeout内部效果失效的问题
2018/08/30 Javascript
node.js中express模块创建服务器和http模块客户端发请求
2019/03/06 Javascript
JS实现从对象获取对象中单个键值的方法示例
2019/06/05 Javascript
微信小程序中button去除默认的边框实例代码
2019/08/01 Javascript
在Vue中使用antv的示例代码
2020/06/29 Javascript
[57:55]完美世界DOTA2联赛PWL S3 Magma vs Phoenix 第二场 12.12
2020/12/16 DOTA
python django集成cas验证系统
2014/07/14 Python
简单介绍Python中的try和finally和with方法
2015/05/05 Python
Windows下python2.7.8安装图文教程
2016/05/26 Python
Python序列化与反序列化pickle用法实例
2019/11/11 Python
python GUI库图形界面开发之PyQt5信号与槽基本操作
2020/02/25 Python
python+opencv边缘提取与各函数参数解析
2020/03/09 Python
基于Python实现下载网易音乐代码实例
2020/08/10 Python
matplotlib基础绘图命令之errorbar的使用
2020/08/13 Python
python中的垃圾回收(GC)机制
2020/09/21 Python
美国的Eastbay旗下的运动款子品牌:Final-Score
2018/01/01 全球购物
德国自行车商店:Tretwerk
2019/06/21 全球购物
英国行业制服供应商:Alexandra
2019/09/14 全球购物
专科毕业生求职简历的自我评价
2013/10/12 职场文书
分公司经理任命书
2014/06/05 职场文书
局领导领导班子四风对照检查材料
2014/09/27 职场文书
幼儿教师小班个人总结
2015/02/05 职场文书
Redis如何一键部署脚本
2021/04/12 Redis
8g内存用python读取10文件_面试题-python 如何读取一个大于 10G 的txt文件?
2021/05/28 Python
2007年老电脑安装win11会怎么样? 网友实测win11在老电脑运行良好
2021/11/21 数码科技