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 相关文章推荐
Python2.x版本中maketrans()方法的使用介绍
May 19 Python
在Python的Django框架中显示对象子集的方法
Jul 21 Python
Python 编码处理-str与Unicode的区别
Sep 06 Python
Python实现的json文件读取及中文乱码显示问题解决方法
Aug 06 Python
Python异常的检测和处理方法
Oct 26 Python
django解决跨域请求的问题
Nov 11 Python
Python-Seaborn热图绘制的实现方法
Jul 15 Python
python 字典有序并写入json文件过程解析
Sep 30 Python
Python多线程threading join和守护线程setDeamon原理详解
Mar 18 Python
Python tkinter界面实现历史天气查询的示例代码
Aug 23 Python
Python求区间正整数内所有素数之和的方法实例
Oct 13 Python
Jmeter调用Python脚本实现参数互相传递的实现
Jan 22 Python
Requests什么的通通爬不了的Python超强反爬虫方案!
python使用glob检索文件的操作
python opencv通过按键采集图片源码
python 如何执行控制台命令与操作剪切板
教你怎么用Python生成九宫格照片
用 Python 元类的特性实现 ORM 框架
May 19 #Python
浅谈Python 中的复数问题
May 19 #Python
You might like
BBS(php &amp; mysql)完整版(四)
2006/10/09 PHP
微信公众平台开发关注及取消关注事件的方法
2014/12/23 PHP
php利用事务处理转账问题
2015/04/22 PHP
PHP大文件分片上传的实现方法
2018/10/28 PHP
jquery select(列表)的操作(取值/赋值)
2009/08/06 Javascript
js下将字符串当函数执行的方法
2011/07/13 Javascript
表单序列化与jq中的serialize使用示例
2014/02/21 Javascript
js匿名函数的调用示例(形式多种多样)
2014/08/20 Javascript
分享我的jquery实现下拉菜单心的
2015/11/29 Javascript
阿里巴巴技术文章分享 Javascript继承机制的实现
2016/01/14 Javascript
老生常谈js动态添加事件--- 事件委托
2016/07/19 Javascript
Koa项目搭建过程详细记录
2018/04/12 Javascript
vue代理和跨域问题的解决
2018/07/18 Javascript
vue.js与后台数据交互的实例讲解
2018/08/08 Javascript
jQuery实现的简单手风琴效果示例
2018/08/29 jQuery
使用javascript做时间倒数读秒功能的实例
2019/01/23 Javascript
详解vuex之store源码简单解析
2019/06/13 Javascript
layui table 列宽百分比显示的实现方法
2019/09/28 Javascript
[54:10]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
Python学习小技巧之列表项的拼接
2017/05/20 Python
Python制作词云的方法
2018/01/03 Python
实践Vim配置python开发环境
2018/07/02 Python
Python下应用opencv 实现人脸检测功能
2019/10/24 Python
python微信公众号开发简单流程实现
2020/03/09 Python
python绘制高斯曲线
2021/02/19 Python
男女时尚与复古风格在线购物:RoseGal(全球免费送货)
2017/07/19 全球购物
北美主要的汽车零部件零售商:AutoShack.com
2019/02/23 全球购物
大学生涯自我鉴定
2014/01/16 职场文书
助理政工师申报材料
2014/06/03 职场文书
党员四风自我剖析材料思想汇报
2014/09/13 职场文书
安全承诺书
2015/01/19 职场文书
行政二审代理词
2015/05/25 职场文书
2016年清明节寄语
2015/12/04 职场文书
Nginx反爬虫策略,防止UA抓取网站
2021/03/31 Servers
通过T-SQL语句创建游标与实现数据库加解密功能
2022/03/16 SQL Server
MySQL导致索引失效的几种情况
2022/06/25 MySQL