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提示No module named images的解决方法
Sep 29 Python
Python实现程序的单一实例用法分析
Jun 03 Python
Python中的urllib模块使用详解
Jul 07 Python
详解python上传文件和字符到PHP服务器
Nov 24 Python
对numpy Array [: ,] 的取值方法详解
Jul 02 Python
Python迭代器与生成器基本用法分析
Jul 26 Python
python3学生名片管理v2.0版
Nov 29 Python
python paramiko利用sftp上传目录到远程的实例
Jan 03 Python
python图片二值化提高识别率代码实例
Aug 24 Python
Pycharm使用远程linux服务器conda/python环境在本地运行的方法(图解))
Dec 09 Python
Python Selenium参数配置方法解析
Jan 19 Python
浅谈pytorch torch.backends.cudnn设置作用
Feb 20 Python
Requests什么的通通爬不了的Python超强反爬虫方案!
python使用glob检索文件的操作
python opencv通过按键采集图片源码
python 如何执行控制台命令与操作剪切板
教你怎么用Python生成九宫格照片
用 Python 元类的特性实现 ORM 框架
May 19 #Python
浅谈Python 中的复数问题
May 19 #Python
You might like
利用文件属性结合Session实现在线人数统计
2006/10/09 PHP
解决PHP超大文件下载,断点续传下载的方法详解
2013/06/06 PHP
PHP生成迅雷、快车、旋风等软件的下载链接代码实例
2014/05/12 PHP
PHP大转盘中奖概率算法实例
2014/10/21 PHP
Laravel 4 初级教程之安装及入门
2014/10/30 PHP
针对多用户实现头像上传功能PHP代码 适用于登陆页面制作
2016/08/17 PHP
PHP入门教程之正则表达式基本用法实例详解(正则匹配,搜索,分割等)
2016/09/11 PHP
php lcg_value与mt_rand生成0~1随机小数的效果对比分析
2017/04/05 PHP
基于jQuery的弹出消息插件 DivAlert之旅(一)
2010/04/01 Javascript
jQuery参数列表集合
2011/04/06 Javascript
基于Javascript实现倒计时功能
2016/02/22 Javascript
bootstrap datepicker 与bootstrapValidator同时使用时选择日期后无法正常触发校验的解决思路
2016/09/28 Javascript
Nodejs基于LRU算法实现的缓存处理操作示例
2017/03/17 NodeJs
Vue非父子组件通信详解
2017/06/12 Javascript
js学习总结_选项卡封装(实例讲解)
2017/07/13 Javascript
基于vue实现圆形菜单栏组件
2019/07/05 Javascript
基于vue 实现表单中password输入的显示与隐藏功能
2019/07/19 Javascript
微信公众号平台接口开发 菜单管理的实现
2019/08/14 Javascript
微信小程序之数据绑定原理解析
2019/08/14 Javascript
Python运行不显示DOS窗口的解决方法
2018/10/22 Python
Django密码存储策略分析
2020/01/09 Python
英国手工布艺沙发在线购买:Sofas & Stuff
2018/03/02 全球购物
澳洲女装时尚在线:Blue Bungalow
2018/05/05 全球购物
库存图片、照片、矢量图、视频和音乐:Shutterstock
2021/02/12 全球购物
介绍一下XMLHttpRequest对象的常用方法和属性
2013/05/24 面试题
煤矿安全演讲稿
2014/05/09 职场文书
考察现实表现材料
2014/05/19 职场文书
团日活动总结怎么写
2014/06/25 职场文书
工会2014法制宣传日活动总结
2014/11/01 职场文书
综合办公室主任岗位职责
2015/04/01 职场文书
员工离职证明范本
2015/06/12 职场文书
体育委员竞选稿
2015/11/21 职场文书
学法用法心得体会(2016推荐篇)
2016/01/21 职场文书
党员公开承诺书(2016最新版)
2016/03/24 职场文书
开发一个封装iframe的vue组件
2021/03/29 Vue.js
SQL Server数据库查询出现阻塞之性能调优
2022/04/10 SQL Server