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通过递归遍历出集合中所有元素的方法
Feb 25 Python
python类继承用法实例分析
May 27 Python
Python正则表达式匹配数字和小数的方法
Jul 03 Python
python保存字典和读取字典的实例代码
Jul 07 Python
Python远程开发环境部署与调试过程图解
Dec 09 Python
python自动化unittest yaml使用过程解析
Feb 03 Python
Python过滤掉numpy.array中非nan数据实例
Jun 08 Python
python和go语言的区别是什么
Jul 20 Python
Python爬取网页信息的示例
Sep 24 Python
Python爬虫之App爬虫视频下载的实现
Dec 08 Python
python中pyqtgraph知识点总结
Jan 26 Python
如何在Python中妥善使用进度条详解
Apr 05 Python
Requests什么的通通爬不了的Python超强反爬虫方案!
python使用glob检索文件的操作
python opencv通过按键采集图片源码
python 如何执行控制台命令与操作剪切板
教你怎么用Python生成九宫格照片
用 Python 元类的特性实现 ORM 框架
May 19 #Python
浅谈Python 中的复数问题
May 19 #Python
You might like
php中处理模拟rewrite 效果
2006/12/09 PHP
四种php中webservice实现的简单架构方法及实例
2015/02/03 PHP
Thinkphp单字母函数使用指南
2016/05/08 PHP
再谈Yii Framework框架中的事件event原理与应用
2020/04/07 PHP
javascript中自定义对象的属性方法分享
2013/07/12 Javascript
wap手机图片滑动切换特效无css3元素js脚本编写
2014/07/28 Javascript
JavaScript字符串对象的concat方法实例(用于连接两个或多个字符串)
2014/10/16 Javascript
Jquery AJAX POST与GET之间的区别详细介绍
2016/10/17 Javascript
JavaScript解析JSON格式数据的方法示例
2017/01/24 Javascript
详解vue渲染从后台获取的json数据
2017/07/06 Javascript
Node之简单的前后端交互(实例讲解)
2017/11/14 Javascript
使用vue实现简单键盘的示例(支持移动端和pc端)
2017/12/25 Javascript
React组件refs的使用详解
2018/02/09 Javascript
JS处理一些简单计算题
2018/02/24 Javascript
vuex实现登录状态的存储,未登录状态不允许浏览的方法
2018/03/09 Javascript
jQuery length 和 size()区别总结
2018/04/26 jQuery
Vue 防止短时间内连续点击后多次触发请求的操作
2020/11/11 Javascript
Python使用稀疏矩阵节省内存实例
2014/06/27 Python
python使用turtle绘制分形树
2018/06/22 Python
Python格式化输出字符串方法小结【%与format】
2018/10/29 Python
pycharm 2018 激活码及破解补丁激活方式
2020/09/21 Python
PyQt5实现画布小程序
2020/05/30 Python
Python基于network模块制作电影人物关系图
2020/06/19 Python
Application Cache未缓存文件无法访问无法加载问题
2014/05/31 HTML / CSS
奢华时尚的独特视角:La Garçonne
2018/06/07 全球购物
ShellScript面试题一则-ShellScript编程
2014/06/24 面试题
高二美术教学反思
2014/01/14 职场文书
家长评语和期望
2014/02/10 职场文书
设计师求职信
2014/07/01 职场文书
庆祝教师节演讲稿
2014/09/03 职场文书
机械工程及自动化专业求职信
2014/09/03 职场文书
领导干部作风建设剖析材料
2014/10/11 职场文书
2015政治思想表现评语
2015/03/25 职场文书
2016年安康杯竞赛活动总结
2016/04/05 职场文书
MySQL基础(一)
2021/04/05 MySQL
python中的class_static的@classmethod的巧妙用法
2021/06/22 Python