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进行TCP网络编程的教程
Apr 29 Python
处理Python中的URLError异常的方法
Apr 30 Python
python统计文本文件内单词数量的方法
May 30 Python
用Python的Django框架来制作一个RSS阅读器
Jul 22 Python
对pandas里的loc并列条件索引的实例讲解
Nov 15 Python
Python 监测文件是否更新的方法
Jun 10 Python
python实现桌面气泡提示功能
Jul 29 Python
Pytorch 神经网络—自定义数据集上实现教程
Jan 07 Python
python pip如何手动安装二进制包
Sep 30 Python
Python importlib模块重载使用方法详解
Oct 13 Python
用Python自动清理电脑内重复文件,只要10行代码(自动脚本)
Jan 09 Python
如何用python写个模板引擎
Jan 14 Python
Requests什么的通通爬不了的Python超强反爬虫方案!
python使用glob检索文件的操作
python opencv通过按键采集图片源码
python 如何执行控制台命令与操作剪切板
教你怎么用Python生成九宫格照片
用 Python 元类的特性实现 ORM 框架
May 19 #Python
浅谈Python 中的复数问题
May 19 #Python
You might like
php array_slice函数的使用以及参数详解
2008/08/30 PHP
PHP 获取客户端真实IP地址多种方法小结
2010/05/15 PHP
PHP中获取时间的下一周下个月的方法
2014/03/18 PHP
Zend Framework入门知识点小结
2016/03/19 PHP
PHP入门教程之PHP操作MySQL的方法分析
2016/09/11 PHP
php+Memcached实现简单留言板功能示例
2017/02/15 PHP
如何用javascript判断录入的日期是否合法
2007/01/08 Javascript
Javascript 事件流和事件绑定
2009/07/16 Javascript
7个Javascript地图脚本整理
2009/10/20 Javascript
JS实现图片翻书效果示例代码
2013/09/09 Javascript
JavaScript 开发工具webstrom使用指南
2014/12/09 Javascript
javascript手风琴下拉菜单实现代码
2015/11/12 Javascript
封装好的javascript前端分页插件pagination
2016/01/04 Javascript
基于BootStrap Metronic开发框架经验小结【五】Bootstrap File Input文件上传插件的用法详解
2016/05/12 Javascript
js获取form表单所有数据的简单方法
2016/08/18 Javascript
BootStrap tooltip提示框使用小结
2016/10/26 Javascript
jQuery实现简单漂亮的Nav导航菜单效果
2017/03/29 jQuery
jQuery 利用ztree实现树形表格的实例代码
2017/09/27 jQuery
jquery获取img的src值实例介绍
2019/01/16 jQuery
命令行批量截图Node脚本示例代码
2019/01/25 Javascript
js实现指定时间倒计时效果
2019/08/26 Javascript
使用npm命令提示: 'npm' 不是内部或外部命令,也不是可运行的程序的处理方法
2020/05/14 Javascript
关于ES6尾调用优化的使用
2020/09/11 Javascript
[02:12]2019完美世界全国高校联赛(春季赛)报名开启
2019/03/01 DOTA
python 多进程通信模块的简单实现
2014/02/20 Python
关于Python中异常(Exception)的汇总
2017/01/18 Python
对pyqt5多线程正确的开启姿势详解
2019/06/14 Python
python-图片流传输的思路及示例(url转换二维码)
2020/12/21 Python
捷克建筑材料网上商店:DEK.cz
2021/03/06 全球购物
国际贸易专业个人求职信格式
2014/02/02 职场文书
商务英语专业大学生职业生涯规划书
2014/09/14 职场文书
毕业生代领毕业材料的授权委托书
2014/09/29 职场文书
党委领导班子整改方案
2014/09/30 职场文书
人生遥控器观后感
2015/06/11 职场文书
2016应届毕业生就业指导课心得体会
2016/01/15 职场文书
详解Spring Security如何在权限中使用通配符
2022/06/28 Java/Android