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 相关文章推荐
多线程爬虫批量下载pcgame图片url 保存为xml的实现代码
Jan 17 Python
Python实现删除Android工程中的冗余字符串
Jan 19 Python
归纳整理Python中的控制流语句的知识点
Apr 14 Python
Python2.7基于淘宝接口获取IP地址所在地理位置的方法【测试可用】
Jun 07 Python
Python实现对百度云的文件上传(实例讲解)
Oct 21 Python
给你选择Python语言实现机器学习算法的三大理由
Nov 15 Python
Python中print函数简单使用总结
Aug 05 Python
深入浅析Python 中的sklearn模型选择
Oct 12 Python
Python any()函数的使用方法
Oct 28 Python
Python 中的 import 机制之实现远程导入模块
Oct 29 Python
python print 格式化输出,动态指定长度的实现
Apr 12 Python
python获取命令行参数实例方法讲解
Nov 02 Python
Requests什么的通通爬不了的Python超强反爬虫方案!
python使用glob检索文件的操作
python opencv通过按键采集图片源码
python 如何执行控制台命令与操作剪切板
教你怎么用Python生成九宫格照片
用 Python 元类的特性实现 ORM 框架
May 19 #Python
浅谈Python 中的复数问题
May 19 #Python
You might like
推荐php模板技术[转]
2007/01/04 PHP
PHP中用正则表达式清除字符串的空白
2011/01/17 PHP
javascript 避免闭包引发的问题
2009/03/17 Javascript
jQuery动画效果-slideUp slideDown上下滑动示例代码
2013/08/28 Javascript
node.js中的buffer.length方法使用说明
2014/12/14 Javascript
jQuery图片特效插件Revealing实现拉伸放大
2015/04/22 Javascript
javascript设计模式之对象工厂函数与构造函数详解
2015/07/30 Javascript
用JavaScript来美化HTML的select标签的下拉列表效果
2015/11/17 Javascript
用JavaScript实现让浏览器停止载入页面的方法
2017/01/19 Javascript
js自定义瀑布流布局插件
2017/05/16 Javascript
layui前段框架日期控件使用方法详解
2017/05/19 Javascript
JavaScript中递归实现的方法及其区别
2017/09/12 Javascript
express默认日志组件morgan的方法
2018/04/05 Javascript
JavaScript+H5实现微信摇一摇功能
2018/05/23 Javascript
layui 优化button按钮和弹出框的方法
2018/08/15 Javascript
解决iview多表头动态更改列元素发生的错误的方法
2018/11/02 Javascript
微信小程序实现省市区三级地址选择
2020/06/21 Javascript
微信小程序使用map组件实现解析经纬度功能示例
2019/01/22 Javascript
JavaScript跳出循环的三种方法(break, return, continue)
2019/07/30 Javascript
python中将字典转换成其json字符串
2014/07/16 Python
Python、Javascript中的闭包比较
2015/02/04 Python
举例讲解Python设计模式编程中对抽象工厂模式的运用
2016/03/02 Python
Python标准库06之子进程 (subprocess包) 详解
2016/12/07 Python
Python 爬虫之Beautiful Soup模块使用指南
2018/07/05 Python
基于python3 的百度图片下载器的实现代码
2019/11/05 Python
Python迷宫生成和迷宫破解算法实例
2019/12/24 Python
Python调用Windows命令打印文件
2020/02/07 Python
Html5 语法与规则简要概述
2014/07/29 HTML / CSS
详解如何在登录过期后跳出Ifram框架
2020/09/10 HTML / CSS
英国家喻户晓的折扣商场:TK Maxx
2017/05/26 全球购物
屈臣氏马来西亚官网:Watsons马来西亚
2019/06/15 全球购物
.NET程序员的数据库面试题
2012/10/10 面试题
医学专业职业生涯规划范文
2014/02/05 职场文书
教师职称自我鉴定
2014/02/12 职场文书
大学生学习2014年全国两会心得体会
2014/03/12 职场文书
经济贸易系毕业生求职信
2014/05/31 职场文书