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实现文件名批量替换和内容替换
Mar 20 Python
Python中asyncore异步模块的用法及实现httpclient的实例
Jun 28 Python
Python pymongo模块用法示例
Mar 31 Python
python 统计数组中元素出现次数并进行排序的实例
Jul 02 Python
python利用Opencv实现人脸识别功能
Apr 25 Python
python读写csv文件方法详细总结
Jul 05 Python
Python中的self用法详解
Aug 06 Python
python中p-value的实现方式
Dec 16 Python
Python 实现加密过的PDF文件转WORD格式
Feb 04 Python
PyTorch在Windows环境搭建的方法步骤
May 12 Python
python实现凯撒密码、凯撒加解密算法
Jun 11 Python
numpy实现RNN原理实现
Mar 02 Python
Requests什么的通通爬不了的Python超强反爬虫方案!
python使用glob检索文件的操作
python opencv通过按键采集图片源码
python 如何执行控制台命令与操作剪切板
教你怎么用Python生成九宫格照片
用 Python 元类的特性实现 ORM 框架
May 19 #Python
浅谈Python 中的复数问题
May 19 #Python
You might like
php UTF-8、Unicode和BOM问题
2010/05/18 PHP
推荐几个开源的微信开发项目
2014/12/28 PHP
php猜单词游戏
2015/09/29 PHP
PHP模板引擎Smarty之配置文件在模板变量中的使用方法示例
2016/04/11 PHP
JavaScript面向对象程序设计三 原型模式(上)
2011/12/21 Javascript
javascript Event对象详解及使用示例
2013/11/22 Javascript
jQuery老黄历完整实现方法
2015/01/16 Javascript
js实现一个链接打开两个链接地址的方法
2015/05/12 Javascript
javascript每日必学之运算符
2016/02/16 Javascript
jQuery实现的简单悬浮层功能完整实例
2017/01/23 Javascript
vue2.0中click点击当前li实现动态切换class
2017/06/21 Javascript
使用Vue写一个datepicker的示例
2018/01/27 Javascript
AngularJS监听ng-repeat渲染完成的方法
2018/03/20 Javascript
elementUI多选框反选的实现代码
2019/04/03 Javascript
优雅地使用loading(推荐)
2019/04/20 Javascript
基于vue+uniapp直播项目实现uni-app仿抖音/陌陌直播室功能
2019/11/12 Javascript
详解如何在vue+element-ui的项目中封装dialog组件
2020/12/11 Vue.js
[43:57]Liquid vs Mineski 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
PyQt5每天必学之关闭窗口
2018/04/19 Python
Python实现银行账户资金交易管理系统
2020/01/03 Python
解决Tensorflow sess.run导致的内存溢出问题
2020/02/05 Python
Centos7下源码安装Python3 及shell 脚本自动安装Python3的教程
2020/03/07 Python
python怎么自定义捕获错误
2020/06/29 Python
韩国知名的家庭购物网站:CJmall
2016/08/01 全球购物
Dr. Martens马汀博士官网:马丁靴始祖品牌
2016/10/15 全球购物
环保倡议书范文
2014/05/12 职场文书
班级学雷锋活动总结
2014/06/26 职场文书
干部个人对照检查材料
2014/08/25 职场文书
2015年元旦演讲稿
2014/09/12 职场文书
人间正道是沧桑观后感
2015/06/15 职场文书
2015国庆66周年宣传语
2015/07/14 职场文书
2015小学毕业班工作总结
2015/07/21 职场文书
2015年卫生院健康教育工作总结
2015/07/24 职场文书
读后感怎么写?书写读后感的基本技巧!
2019/12/10 职场文书
Nginx Rewrite使用场景及配置方法解析
2021/04/01 Servers
Java实战之用Swing实现通讯录管理系统
2021/06/13 Java/Android