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远程登录代码
Apr 29 Python
python在指定目录下查找gif文件的方法
May 04 Python
python开发之文件操作用法实例
Nov 13 Python
学习Python3 Dlib19.7进行人脸面部识别
Jan 24 Python
python实现电脑自动关机
Jun 20 Python
计算机二级python学习教程(2) python语言基本语法元素
May 16 Python
python 并发编程 多路复用IO模型详解
Aug 20 Python
Python 异步协程函数原理及实例详解
Nov 13 Python
Pytorch中的VGG实现修改最后一层FC
Jan 15 Python
python实现交并比IOU教程
Apr 16 Python
Python configparser模块应用过程解析
Aug 14 Python
Python高并发和多线程有什么关系
Nov 14 Python
Requests什么的通通爬不了的Python超强反爬虫方案!
python使用glob检索文件的操作
python opencv通过按键采集图片源码
python 如何执行控制台命令与操作剪切板
教你怎么用Python生成九宫格照片
用 Python 元类的特性实现 ORM 框架
May 19 #Python
浅谈Python 中的复数问题
May 19 #Python
You might like
php环境下利用session防止页面重复刷新的具体实现
2014/01/09 PHP
php利用腾讯ip分享计划获取地理位置示例分享
2014/01/20 PHP
浅谈PHP中如何实现Hook机制
2017/11/14 PHP
ThinkPHP5框架实现简单的批量查询功能示例
2018/06/07 PHP
使javascript也能包含文件
2006/10/26 Javascript
TreeView 用法(有代码)(asp.net)
2011/07/15 Javascript
jquery实现的带缩略图的焦点图片切换(自动播放/响应鼠标动作)
2013/01/23 Javascript
原生js操作checkbox用document.getElementById实现
2013/10/12 Javascript
JQuery EasyUI 日期控件如何控制日期选择区间
2014/05/05 Javascript
JavaScript中使用stopPropagation函数停止事件传播例子
2014/08/27 Javascript
jQuery调用Webservice传递json数组的方法
2016/08/06 Javascript
React Native react-navigation 导航使用详解
2017/12/01 Javascript
Vue 自定义动态组件实例详解
2018/03/28 Javascript
vue.js配合$.post从后台获取数据简单demo分享
2018/08/11 Javascript
vue-cli+axios实现文件上传下载功能(下载接收后台返回文件流)
2019/05/10 Javascript
详解在Angular4中使用ng2-baidu-map的方法
2019/06/19 Javascript
ElementUI radio组件选中小改造
2019/08/12 Javascript
使用layui实现树形结构的方法
2019/09/20 Javascript
基于jQuery实现可编辑的表格
2019/12/11 jQuery
python实现360皮肤按钮控件示例
2014/02/21 Python
python爬取51job中hr的邮箱
2016/05/14 Python
详解python使用Nginx和uWSGI来运行Python应用
2018/01/09 Python
完美解决Python 2.7不能正常使用pip install的问题
2018/06/12 Python
对django layer弹窗组件的使用详解
2019/08/31 Python
Python爬取豆瓣视频信息代码实例
2019/11/16 Python
pyftplib中文乱码问题解决方案
2020/01/11 Python
Python异步编程之协程任务的调度操作实例分析
2020/02/01 Python
Python新手如何理解循环加载模块
2020/05/29 Python
浅析Python 责任链设计模式
2020/09/11 Python
Django如何重置migration的几种情景
2021/02/24 Python
Python使用paramiko连接远程服务器执行Shell命令的实现
2021/03/04 Python
俄罗斯最大的隐形眼镜销售网站:Ochkov.Net
2021/02/07 全球购物
什么是ARP(Address Resolution Protocol)地址解析协议
2013/10/31 面试题
Ajax和javascript的区别
2013/07/20 面试题
服务员岗位职责
2015/02/03 职场文书
第一军规观后感
2015/06/12 职场文书