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随机数random模块使用指南
Sep 09 Python
Python优化技巧之利用ctypes提高执行速度
Sep 11 Python
python正则表达式面试题解答
Apr 28 Python
Python实现合并同一个文件夹下所有PDF文件的方法示例
Apr 28 Python
pandas将numpy数组写入到csv的实例
Jul 04 Python
PyGame贪吃蛇的实现代码示例
Nov 21 Python
PyQt弹出式对话框的常用方法及标准按钮类型
Feb 27 Python
Python3字符串encode与decode的讲解
Apr 02 Python
django fernet fields字段加密实践详解
Aug 12 Python
Python如何将函数值赋给变量
Apr 28 Python
ITK 实现多张图像转成单个nii.gz或mha文件案例
Jul 01 Python
python从PDF中提取数据的示例
Oct 30 Python
Requests什么的通通爬不了的Python超强反爬虫方案!
python使用glob检索文件的操作
python opencv通过按键采集图片源码
python 如何执行控制台命令与操作剪切板
教你怎么用Python生成九宫格照片
用 Python 元类的特性实现 ORM 框架
May 19 #Python
浅谈Python 中的复数问题
May 19 #Python
You might like
解读PHP的Yii框架中请求与响应的处理流程
2016/03/17 PHP
thinkphp5使用无限极分类
2019/02/18 PHP
js几个不错的函数 $$()
2006/10/09 Javascript
jquery如何通过name名称获取当前name的value值
2013/12/20 Javascript
jquery解析XML及获取XML节点名称的实现代码
2016/05/18 Javascript
妙用Bootstrap的 popover插件实现校验表单提示功能
2016/08/29 Javascript
bootstrap实现的自适应页面简单应用示例
2017/03/09 Javascript
nodejs6下使用koa2框架实例
2017/05/18 NodeJs
解决vue2.x中数据渲染以及vuex缓存的问题
2017/07/13 Javascript
JS Input里添加小图标的两种方法
2017/11/11 Javascript
vue中eventbus被多次触发以及踩过的坑
2017/12/02 Javascript
微信小程序非跳转式组件授权登录的方法示例
2019/05/22 Javascript
JavaScript运动原理基础知识详解
2020/04/02 Javascript
[01:03:42]VP vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
深入理解Python中各种方法的运作原理
2015/06/15 Python
python类:class创建、数据方法属性及访问控制详解
2016/07/25 Python
Python 确定多项式拟合/回归的阶数实例
2018/12/29 Python
python 回溯法模板详解
2020/02/26 Python
Python单例模式的四种创建方式实例解析
2020/03/04 Python
python实现暗通道去雾算法的示例
2020/09/27 Python
Pyecharts 中Geo函数常用参数的用法说明
2021/02/01 Python
CSS3 选择器 基本选择器介绍
2012/01/21 HTML / CSS
斯巴达比赛商店:Spartan Race
2019/01/08 全球购物
AJax面试题
2014/11/25 面试题
英文版餐饮业求职信
2013/10/18 职场文书
制定岗位职责的原则
2013/11/08 职场文书
活动志愿者自荐信
2014/01/27 职场文书
药品促销活动方案
2014/02/14 职场文书
运动会跳远广播稿5篇
2014/09/17 职场文书
教师节横幅标语
2014/10/08 职场文书
导游词之江苏同里古镇
2019/11/18 职场文书
Oracle 死锁的检测查询及处理
2021/09/25 Oracle
vue3引入highlight.js进行代码高亮的方法实例
2022/04/08 Vue.js
使用Postman测试需要授权的接口问题
2022/06/21 Java/Android
基于Redission的分布式锁实战
2022/08/14 Redis
服务器nginx权限被拒绝解决案例
2022/09/23 Servers