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 相关文章推荐
Python3基础之list列表实例解析
Aug 13 Python
python正则表达式中的括号匹配问题
Dec 14 Python
python+selenium开发环境搭建图文教程
Aug 11 Python
PyQt实现界面翻转切换效果
Apr 20 Python
python实现textrank关键词提取
Jun 22 Python
python接口自动化(十七)--Json 数据处理---一次爬坑记(详解)
Apr 18 Python
使用Python-OpenCV向图片添加噪声的实现(高斯噪声、椒盐噪声)
May 28 Python
python3 assert 断言的使用详解 (区别于python2)
Nov 27 Python
Python for循环与getitem的关系详解
Jan 02 Python
python实现飞船游戏的纵向移动
Apr 24 Python
通过实例解析python and和or使用方法
Nov 14 Python
Python破解极验滑动验证码详细步骤
May 21 Python
Requests什么的通通爬不了的Python超强反爬虫方案!
python使用glob检索文件的操作
python opencv通过按键采集图片源码
python 如何执行控制台命令与操作剪切板
教你怎么用Python生成九宫格照片
用 Python 元类的特性实现 ORM 框架
May 19 #Python
浅谈Python 中的复数问题
May 19 #Python
You might like
php图片处理:加水印、缩略图的实现(自定义函数:watermark、thumbnail)
2010/12/02 PHP
PHP中使用TCPDF生成PDF文档实例
2014/07/01 PHP
CI框架网页缓存简单用法分析
2018/12/26 PHP
PHP调用全国天气预报数据接口查询天气示例
2019/02/20 PHP
PHP实现八皇后算法
2019/05/06 PHP
jquery.validate分组验证代码
2011/03/17 Javascript
jquery获取table中的某行全部td的内容方法
2013/03/08 Javascript
jquery禁用右键单击功能屏蔽F5刷新
2014/03/17 Javascript
javascript制作网页图片上实现下雨效果
2015/02/26 Javascript
bootstrap滚动监控器使用方法解析
2017/01/13 Javascript
JavaScript 函数节流详解及方法总结
2017/02/09 Javascript
JS图片预加载插件详解
2017/06/21 Javascript
JavaScript 获取元素在父节点中的下标(推荐)
2017/06/28 Javascript
[js高手之路]从原型链开始图解继承到组合继承的产生详解
2017/08/28 Javascript
Vue.js项目模板搭建图文教程
2017/09/20 Javascript
详解基于mpvue的小程序markdown适配解决方案
2018/05/08 Javascript
JS尾递归的实现方法及代码优化技巧
2019/01/19 Javascript
Vee-validate 父组件获取子组件表单校验结果的实例代码
2019/05/20 Javascript
[00:52]DOTA2国际邀请赛
2020/02/21 DOTA
python 专题九 Mysql数据库编程基础知识
2017/03/16 Python
Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
2019/05/27 Python
python字符串判断密码强弱
2020/03/18 Python
Keras中 ImageDataGenerator函数的参数用法
2020/07/03 Python
iphoneX 适配客户端H5页面的方法教程
2017/12/08 HTML / CSS
Myholidays美国:在线旅游网站
2019/08/16 全球购物
测绘工程个人的自我评价
2013/11/10 职场文书
酒店前厅员工辞职信
2014/01/08 职场文书
国贸专业的职业规划范文
2014/01/23 职场文书
2014年政教处工作总结
2014/12/20 职场文书
2015年家长学校工作总结
2015/04/22 职场文书
办公经费申请报告
2015/05/15 职场文书
幽灵公主观后感
2015/06/09 职场文书
观后感格式
2015/06/19 职场文书
pytorch 梯度NAN异常值的解决方案
2021/06/05 Python
JS代码编译器Monaco使用方法
2021/06/11 Javascript
「女孩的钓鱼慢活」全新版权绘公布
2022/03/21 日漫