国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

python 如何在list中找Topk的數(shù)值和索引

瀏覽:3日期:2022-06-19 09:19:29
需求:

對(duì)于一個(gè)python list 或者numpy數(shù)組,我需要找到這個(gè)list中最大的K個(gè)數(shù)及其對(duì)應(yīng)的下標(biāo)。

解決方式:

1. 可以構(gòu)造字典通過(guò)排序解決,不過(guò)代碼量較多。

2. 使用heapq庫(kù),可以直接獲取最大值的下標(biāo)和數(shù)值。

import heapqa = [4,2,6,1,9,9] # 獲取下標(biāo), 輸出為[4, 5, 2]heapq.nlargest(3, range(len(a)), a.__getitem__) # 獲取數(shù)值, 輸出為[9, 9, 6]heapq.nlargest(3,a)

如果要取最小的數(shù),使用 nsmallest即可

補(bǔ)充:Python 利用中間值求TopK 算法

算法思想

首先我們要思考,我要做什么?解決什么問(wèn)題?

TopK問(wèn)題,找出一組數(shù)據(jù)中的前K個(gè)最大值或者最小值,這個(gè)數(shù)據(jù)是否重復(fù)?要做去重處理?

ok 我們明確我們做什么了 ,那介紹的python處理的topK 算法過(guò)程是怎么樣的呢?

如果用排序那就沒(méi)必要引入topK 了,當(dāng)數(shù)據(jù)強(qiáng)大的時(shí)候選取TopK 可以省略很多排序的計(jì)算,至于有多優(yōu)化自己去思考下,就比如排列組合的C,A的區(qū)別,一個(gè)是抽取,一個(gè)是抽取并排列…

以下以找出TopK 的最大值為例,最小值的可以自己修改一下下就可以

介紹的算法思想是利用中間值,將數(shù)列分為三部分 ,

【比中間值大的列表】,中間值,【比中間值小的列表】

那么我們當(dāng)比較

【比中間值大的列表】的個(gè)數(shù) == k

的時(shí)候就可以得出前K個(gè)最大值了,因此

重點(diǎn)就是找出這個(gè)中間值如何找出中間值

以列表的第一個(gè)數(shù)開(kāi)始為中間值,拆分為三部分

if 【比中間值大的列表】的個(gè)數(shù) == k:return 中間值 #程序出口,結(jié)束。

if 【比中間值大的列表】的個(gè)數(shù) < k :

·····繼續(xù)在【比中間值小的列表】找

·····K - 【比中間值大的列表】的個(gè)數(shù) -1 個(gè)數(shù)

(為什么要減一,1是前一次的中間值,分的三部分,前部分后部分都沒(méi)有包含中間值,因此…)

if 【比中間值大的列表】的個(gè)數(shù) > k :

…也就是說(shuō)比中間值大的列表比K還大,那就在這個(gè)列表中繼續(xù)找就行

結(jié)合代碼和注釋看

如果要找最小值,只需要改一下就ok ,還可以設(shè)置一個(gè)布爾值的輸入,來(lái)做前K個(gè)最大值最小值

#2019 11 04#author 半斤地瓜燒#TopK 算法,找出序列中前K個(gè)最大值的#輸入一個(gè)seq# 輸出以seq[0]為中間值 劃分的三個(gè)部分,中間值,比這個(gè)值大的seq ,比這個(gè)值小的seq,# 即splitNum,theBig,theSmalldef Split_Seq(seq): splitNum = seq[0] seq = seq[1:]#兩個(gè)部分都不包含中間值,因此切片去除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#出口,返回這個(gè)中間值, # 為什么不直接返回thebig?因?yàn)榇嬖谶f歸的原因thebig 不是在初始的seq找出來(lái)的 #需要重新Split,即可,讀者自己思考 # 大值的列表中還未夠K個(gè)數(shù)的情況, if k > theBigLen:return topKNum(theSmall,k-theBigLen-1) # 大值的列表中大于K個(gè)數(shù)的情況 return topKNum(theBig,k)#由中間值找出TopK個(gè)值,<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('===為了驗(yàn)證,引入排序觀看===', sorted(alist,reverse= True)) print(getTopK(alist, 3))

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 亚洲精品手机在线观看 | 亚洲欧美日韩精品永久在线 | 91网站网站网站在线 | 国产欧美亚洲三区久在线观看 | 男人把女人桶到喷白浆的视频 | 久久久久久久久免费影院 | 真人一级毛片 | 日韩在线精品视频 | 国产精品18久久久久久vr | a国产成人免费视频 | 久久久久久毛片免费观看 | 在线91精品国产免费 | 亚洲精品国产精品一区二区 | 国产美女作爱全过程免费视频 | 欧美亚洲国产一区 | 国产在线精品福利91香蕉 | 国产成人精品日本亚洲专一区 | 日韩专区亚洲国产精品 | 青青热在线精品视频免费 | 国亚洲欧美日韩精品 | 222aaa免费国产在线观看 | 综合精品在线 | 亚洲厕拍 | 久久久成人啪啪免费网站 | 欧美三级做爰在线 | 久久综合狠狠综合久久97色 | 久草在线免费资源 | 午夜性生活视频 | xxx免费视频 | 亚洲自拍在线观看 | 99久久www免费| 久久综合精品国产一区二区三区无 | 女人国产香蕉久久精品 | 国产精品99久久免费观看 | 97视频在线观看免费播放 | 中文字幕福利片 | 久草看片 | 国产性大片黄在线观看在线放 | 国产性较精品视频免费 | 成人免费网站视频www | 亚洲一区二区三区精品视频 |