python 如何在list中找Topk的数值和索引
作者:lwgkzl 发布时间:2022-01-20 10:28:27
需求:
对于一个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))
来源:https://blog.csdn.net/lwgkzl/article/details/107484265


猜你喜欢
- 本文实例讲述了Python基于pygame模块播放MP3的方法。分享给大家供大家参考,具体如下:安装pygame(可参考:安装Python和
- 最近使用python里的matplotlib库绘图,想在代码结束时显示图片看看,结果图片一闪而过,附上我原来代码:import matplo
- 我们可以调用matplotlib 绘制我们的柱状图,柱状图可以是水平的也可以是竖直的。在这里我先记录下竖直的柱状图怎么绘制在这里一般用到的函
- 一、分析阶段 一般来说,在系统分析阶段往往有太多需要关注的地方,系统各种功能性、可用性、可靠性、安全性需求往往吸引了我们大部分的注意力,但是
- 日期和时间类型MySQL有多个表示各种日期和时间值的数据类型, 比如YEAR和DATE. MySQL存储时间的最精确粒度是秒。 然而, 能做
- 这个需求是产品提的,一开始只是设置了 <input style="padding-top: 3px;" type=
- 由于最近开始做一些go写的外围程序,因此开始关注go的日志,毕竟自带的logger模块功能较少。简单看了一些资料以后最开始使用seelog,
- 如下所示:def user_degree(self): degree = self.user.update_grade() &n
- Excel中的一些概念一个excel文件中可以包含多个sheet,一个sheet可以理解成一个表格表格的每一行称为 Row表格的每一行中的任
- 在python中利用numpy array进行数据处理,经常需要找出符合某些要求的数据位置,有时候还需要对这些位置重新赋值。这里总结了几种找
- 提到SQL Server 2005证书,很多人可能以为它只是用来在传输数据的时候起到加密作用的,但在深入了解后,你会发现它的用处还有很多。
- 在抓取网络数据的时候,有时会用正则对结构化的数据进行提取,比如 href="https://www.1234.com"等
- 要自动发微博最简单的办法无非是调用新浪微博的API(因为只是简单的发微博,就没必要用它的SDK了)。参考开发文档http://o
- 假设我们需要从各种网页中提取全文,并且要剥离所有HTML标记。通常,默认解决方案是使用BeautifulSoup软件包中的get_text方
- 用analyze进行处理,定期进行处理ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tb1_name
- 功能:读取txt文本,然后将目的字符串标红,再将处理过的字符串写入docx中txt文本内容:啊打发发烧鳌太路线点击点击诶的骄傲计划将鳌太标红
- 穿过云朵升一级是要花6个金币的,有的时候金币真的很重要前言嗨喽,大家好呀!这里是魔王~一天晚上,天空中掉下一颗神奇的豌豆种子,正好落在了梦之
- 本文实例为大家分享了ADO.NET通用数据库访问类,供大家参考学习,具体内容如下using System;using System.Coll
- fab命令好似结合我们编写的fabfile.py(其它文件名必须添加-f filename应用)来搭配使用的,部分命令行参数可以通过相应的方
- Delphi连接MySQL真麻烦,研究了一天,从网上找了无数文章,下载了无数插件都没解决。最后返璞归真,老老实实用ADO来连接,发现也不是很