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函数参数*args**kwargs用法实例
Dec 04 Python
python BeautifulSoup设置页面编码的方法
Apr 03 Python
详解Python的Django框架中的templates设置
May 11 Python
Python二分查找详解
Sep 13 Python
详解Swift中属性的声明与作用
Jun 30 Python
python爬取亚马逊书籍信息代码分享
Dec 09 Python
python 以16进制打印输出的方法
Jul 09 Python
django DRF图片路径问题的解决方法
Sep 10 Python
django多文件上传,form提交,多对多外键保存的实例
Aug 06 Python
python调用函数、类和文件操作简单实例总结
Nov 29 Python
使用Keras实现Tensor的相乘和相加代码
Jun 18 Python
细说NumPy数组的四种乘法的使用
Dec 18 Python
Requests什么的通通爬不了的Python超强反爬虫方案!
python使用glob检索文件的操作
python opencv通过按键采集图片源码
python 如何执行控制台命令与操作剪切板
教你怎么用Python生成九宫格照片
用 Python 元类的特性实现 ORM 框架
May 19 #Python
浅谈Python 中的复数问题
May 19 #Python
You might like
桌面中心(二)数据库写入
2006/10/09 PHP
使用sockets:从新闻组中获取文章(一)
2006/10/09 PHP
解析linux下安装memcacheq(mcq)全过程笔记
2013/06/27 PHP
PHP多个文件上传到服务器实例
2014/10/29 PHP
PHP实现动态执行代码的方法
2016/03/25 PHP
php定期拉取数据对比方法实例
2019/09/22 PHP
php慢查询日志和错误日志使用详解
2021/02/27 PHP
关于JavaScript定义类和对象的几种方式
2010/11/09 Javascript
Array.prototype.concat不是通用方法反驳[译]
2012/09/20 Javascript
解析javascript系统错误:-1072896658的解决办法
2013/07/08 Javascript
nodeType属性返回被选节点的节点类型介绍
2013/11/22 Javascript
JS截取与分割字符串常用技巧总结
2015/11/10 Javascript
jQuery实现控制文字内容溢出用省略号(…)表示的方法
2016/02/26 Javascript
AngularJS ng-app 指令实例详解
2016/07/30 Javascript
详细分析Javascript中创建对象的四种方式
2016/08/17 Javascript
简单实现Vue的observer和watcher
2016/12/21 Javascript
vue-router实现webApp切换页面动画效果代码
2017/05/25 Javascript
利用JS对iframe父子(内外)页面进行操作的方法教程
2017/06/15 Javascript
详解vue项目首页加载速度优化
2017/10/18 Javascript
JS实现二维数组横纵列转置的方法
2018/04/17 Javascript
使用vue-cli脚手架工具搭建vue-webpack项目
2019/01/14 Javascript
JavaScript函数式编程(Functional Programming)纯函数用法分析
2019/05/22 Javascript
vue路由传参页面刷新参数丢失问题解决方案
2019/10/08 Javascript
[57:12]完美世界DOTA2联赛循环赛 Inki vs Matador BO2第一场 10.31
2020/11/02 DOTA
python实现逆波兰计算表达式实例详解
2015/05/06 Python
使用Python写CUDA程序的方法
2017/03/27 Python
1 行 Python 代码快速实现 FTP 服务器
2018/01/25 Python
用Python配平化学方程式的方法
2019/07/20 Python
Python3 hashlib密码散列算法原理详解
2020/03/30 Python
django项目中新增app的2种实现方法
2020/04/01 Python
Python图像处理之膨胀与腐蚀的操作
2021/02/07 Python
x-ua-compatible content=”IE=7, IE=9″意思理解
2013/07/22 HTML / CSS
印度手工编织服装和家居用品商店:Fabindi
2019/10/07 全球购物
生物化工专业个人自荐信
2013/09/26 职场文书
2014年工程部工作总结
2014/11/25 职场文书
MySQL中的 inner join 和 left join的区别解析(小结果集驱动大结果集)
2023/05/08 MySQL