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 相关文章推荐
10个易被忽视但应掌握的Python基本用法
Apr 01 Python
python中Genarator函数用法分析
Apr 08 Python
Python中内建函数的简单用法说明
May 05 Python
用 Python 爬了爬自己的微信朋友(实例讲解)
Aug 25 Python
Django实现快速分页的方法实例
Oct 22 Python
python使用matplotlib库生成随机漫步图
Aug 27 Python
python使用PIL实现多张图片垂直合并
Jan 15 Python
python plt可视化——打印特殊符号和制作图例代码
Apr 17 Python
Python 使用office365邮箱的示例
Oct 29 Python
Python 使用xlwt模块将多行多列数据循环写入excel文档的操作
Nov 10 Python
Python模拟键盘输入自动登录TGP
Nov 27 Python
详解Python中的for循环
Apr 30 Python
Requests什么的通通爬不了的Python超强反爬虫方案!
python使用glob检索文件的操作
python opencv通过按键采集图片源码
python 如何执行控制台命令与操作剪切板
教你怎么用Python生成九宫格照片
用 Python 元类的特性实现 ORM 框架
May 19 #Python
浅谈Python 中的复数问题
May 19 #Python
You might like
再次研究下cache_lite
2007/02/14 PHP
PHP字符串的递增和递减示例介绍
2014/02/11 PHP
PHP往XML中添加节点的方法
2015/03/12 PHP
在Javascript中定义对象类别
2006/12/22 Javascript
ExtJs使用IFrame的实现代码
2010/03/24 Javascript
实用的JS正则表达式(手机号码/IP正则/邮编正则/电话等)
2013/01/11 Javascript
a标签click和href执行顺序探讨
2014/06/23 Javascript
深入分析JSONP跨域的原理
2014/12/10 Javascript
javascript实现 百度翻译 可折叠的分享按钮列表
2015/03/12 Javascript
javascript实现链接单选效果的方法
2015/05/13 Javascript
微信开发 js实现tabs选项卡效果
2016/10/28 Javascript
PHP实现本地图片上传和验证功能
2017/02/27 Javascript
node.js调用Chrome浏览器打开链接地址的方法
2017/05/17 Javascript
JS获取一个表单字段中多条数据并转化为json格式
2017/10/17 Javascript
Vue导出页面为PDF格式的实现思路
2018/07/31 Javascript
vue实现滑动到底部加载更多效果
2020/10/27 Javascript
详解微信小程序开发之formId使用(模板消息)
2019/08/27 Javascript
浅谈vue限制文本框输入数字的正确姿势
2019/09/02 Javascript
ckeditor一键排版功能实现方法分析
2020/02/06 Javascript
Django中几种重定向方法
2015/04/28 Python
Android分包MultiDex策略详解
2017/10/30 Python
pandas 小数位数 精度的处理方法
2018/06/09 Python
对Python 语音识别框架详解
2018/12/24 Python
Python Django 封装分页成通用的模块详解
2019/08/21 Python
Python安装OpenCV的示例代码
2020/03/05 Python
英国家庭珠宝商:T. H. Baker
2018/02/08 全球购物
C面试题
2015/10/08 面试题
软件测试面试题
2014/01/05 面试题
电子商务毕业生求职信
2013/11/10 职场文书
化工专业个人的求职信范文
2013/11/28 职场文书
国际贸易专业个人求职信范文分享
2013/12/14 职场文书
服务型党组织建设典型材料
2014/05/07 职场文书
党支部创先争优活动总结
2014/08/28 职场文书
详解CSS不受控制的position fixed
2021/05/25 HTML / CSS
Redis监控工具RedisInsight安装与使用
2022/03/21 Redis
windows10声卡驱动怎么安装?win10声卡驱动安装操作步骤教程
2022/08/05 数码科技