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的Flask框架结合MySQL写一个内存监控程序
Nov 07 Python
Python 正则表达式入门(中级篇)
Dec 07 Python
Python 模拟购物车的实例讲解
Sep 11 Python
Scrapy的简单使用教程
Oct 24 Python
Python并发之多进程的方法实例代码
Aug 15 Python
python画图的函数用法以及技巧
Jun 28 Python
python如何给字典的键对应的值为字典项的字典赋值
Jul 05 Python
python绘图模块matplotlib示例详解
Jul 26 Python
python线程中的同步问题及解决方法
Aug 29 Python
Python3如何在Windows和Linux上打包
Feb 25 Python
python判断是空的实例分享
Jul 06 Python
python使用torch随机初始化参数
Mar 22 Python
Requests什么的通通爬不了的Python超强反爬虫方案!
python使用glob检索文件的操作
python opencv通过按键采集图片源码
python 如何执行控制台命令与操作剪切板
教你怎么用Python生成九宫格照片
用 Python 元类的特性实现 ORM 框架
May 19 #Python
浅谈Python 中的复数问题
May 19 #Python
You might like
PHP的cURL库功能简介 抓取网页、POST数据及其他
2011/04/07 PHP
PHP登陆后跳转到登陆前页面实现思路及代码
2014/01/17 PHP
php判断是否为ajax请求的方法
2016/11/29 PHP
JS刷新框架外页面七种实现代码
2013/02/18 Javascript
js中Math之random,round,ceil,floor的用法总结
2013/12/26 Javascript
javascript实现节点(div)名称编辑
2014/12/17 Javascript
jQuery对象初始化的传参方式
2015/02/26 Javascript
html5+javascript实现简单上传的注意细节
2016/04/18 Javascript
全面解析JS字符串和正则表达式中的match、replace、exec等函数
2016/07/01 Javascript
两种JavaScript的AES加密方式(可与Java相互加解密)
2016/08/02 Javascript
JavaScript 总结几个提高性能知识点(推荐)
2017/02/20 Javascript
详解Vue组件实现tips的总结
2017/11/01 Javascript
jQuery+datatables插件实现ajax加载数据与增删改查功能示例
2018/04/17 jQuery
基于vue2.0实现仿百度前端分页效果附实现代码
2018/10/30 Javascript
jQuery无冲突模式详解
2019/01/17 jQuery
Vue框架下引入ActiveX控件的问题解决
2019/03/25 Javascript
jquery实现垂直无限轮播的方法分析
2019/07/16 jQuery
JS检索下拉列表框中被选项目的索引号(selectedIndex)
2019/12/17 Javascript
微信小程序实现同时上传多张图片
2020/02/03 Javascript
JavaScript实现手机号码 3-4-4格式并控制新增和删除时光标的位置
2020/06/02 Javascript
Python写的Discuz7.2版faq.php注入漏洞工具
2014/08/06 Python
Python内置的字符串处理函数详细整理(覆盖日常所用)
2014/08/19 Python
在Python中使用判断语句和循环的教程
2015/04/25 Python
Python使用面向对象方式创建线程实现12306售票系统
2015/12/24 Python
Python+Selenium自动化实现分页(pagination)处理
2017/03/31 Python
python更改已存在excel文件的方法
2018/05/03 Python
Python3.6简单反射操作示例
2018/06/14 Python
Python3转换html到pdf的不同解决方案
2019/03/11 Python
浅谈Pytorch中的torch.gather函数的含义
2019/08/18 Python
keras模型保存为tensorflow的二进制模型方式
2020/05/25 Python
员工自我鉴定
2013/10/09 职场文书
医药大学生求职简历的自我评价
2013/10/17 职场文书
初中毕业感言300字
2015/07/31 职场文书
2019年XX公司的晨会制度及流程!
2019/07/23 职场文书
浅谈css实现背景颜色半透明的两种方法
2021/12/06 HTML / CSS
在MySQL中你成功的避开了所有索引
2022/04/20 MySQL