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中for循环的使用
Apr 14 Python
Python抽象类的新写法
Jun 18 Python
Python使用base64模块进行二进制数据编码详解
Jan 11 Python
Python实现登陆文件验证方法
Oct 06 Python
Python基本数据结构之字典类型dict用法分析
Jun 08 Python
Python基本类型的连接组合和互相转换方式(13种)
Dec 16 Python
python3.7通过thrift操作hbase的示例代码
Jan 14 Python
python多进程下的生产者和消费者模型
May 07 Python
详解python中groupby函数通俗易懂
May 14 Python
Python3读写ini配置文件的示例
Nov 06 Python
python Xpath语法的使用
Nov 26 Python
python实现批量提取指定文件夹下同类型文件
Apr 05 Python
Requests什么的通通爬不了的Python超强反爬虫方案!
python使用glob检索文件的操作
python opencv通过按键采集图片源码
python 如何执行控制台命令与操作剪切板
教你怎么用Python生成九宫格照片
用 Python 元类的特性实现 ORM 框架
May 19 #Python
浅谈Python 中的复数问题
May 19 #Python
You might like
用PHP+MySql编写聊天室
2006/10/09 PHP
php连接Access数据库错误及解决方法
2013/06/20 PHP
layui框架实现文件上传及TP3.2.3(thinkPHP)对上传文件进行后台处理操作示例
2018/05/12 PHP
基于JQuery的Pager分页器实现代码
2010/07/17 Javascript
jQuery UI Datepicker length为空或不是对象错误的解决方法
2010/12/19 Javascript
js实现双向链表互联网机顶盒实战应用实现
2011/10/28 Javascript
JavaScript生成SQL查询表单的方法
2015/08/13 Javascript
Bootstrap优化站点资源、响应式图片、传送带使用详解3
2016/10/14 Javascript
很棒的vue弹窗组件
2017/05/24 Javascript
微信小程序实现动态设置placeholder提示文字及按钮选中/取消状态的方法
2017/12/14 Javascript
vue使用axios时关于this的指向问题详解
2017/12/22 Javascript
jQuery实现的下雪动画效果示例【附源码下载】
2018/02/02 jQuery
JavaScript折半查找(二分查找)算法原理与实现方法示例
2018/08/06 Javascript
vue-cli项目代理proxyTable配置exclude的方法
2018/09/20 Javascript
vue中v-for循环给标签属性赋值的方法
2018/10/18 Javascript
JQuery中queue方法用法示例
2019/01/31 jQuery
微信小程序实现单选选项卡切换效果
2020/06/19 Javascript
详解基于Vue的支持数据双向绑定的select组件
2019/09/02 Javascript
js实现点击上传图片并设为模糊背景
2020/08/02 Javascript
详解uniapp的全局变量实现方式
2021/01/11 Javascript
Django 如何获取前端发送的头文件详解(推荐)
2017/08/15 Python
django js实现部分页面刷新的示例代码
2018/05/28 Python
python中sys.argv函数精简概括
2018/07/08 Python
浅谈python3发送post请求参数为空的情况
2018/12/28 Python
详细介绍Python进度条tqdm的使用
2019/07/31 Python
Python3简单爬虫抓取网页图片代码实例
2019/08/26 Python
Python单元测试模块doctest的具体使用
2020/02/10 Python
Django 允许局域网中的机器访问你的主机操作
2020/05/13 Python
django 模型字段设置默认值代码
2020/07/15 Python
python中pyplot基础图标函数整理
2020/11/10 Python
H5离线存储Manifest原理及使用
2020/04/28 HTML / CSS
GUESS德国官网:美国牛仔服装品牌
2017/02/14 全球购物
以下为Windows NT 下的32 位C++程序,请计算sizeof 的值
2016/12/07 面试题
会议室管理制度范本
2015/08/06 职场文书
学生会宣传部竞选稿
2015/11/21 职场文书
python用tkinter开发的扫雷游戏
2021/06/01 Python