人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動態(tài)

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

發(fā)布日期:2022-06-02 14:49 | 文章來源:CSDN

需求:

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

解決方式:

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

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

import heapq
a = [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 算法

算法思想

首先我們要思考,我要做什么?解決什么問題?

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

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

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

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

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

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

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

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

的時候就可以得出前K個最大值了,因此

重點就是找出這個中間值

如何找出中間值

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

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

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

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

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

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

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

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

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

如果要找最小值,只需要改一下就ok ,還可以設(shè)置一個布爾值的輸入,來做前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個數(shù)的情況,
 if k > theBigLen:
  return topKNum(theSmall,k-theBigLen-1)
 # 大值的列表中大于K個數(shù)的情況
 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))

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持本站。

美國服務(wù)器租用

版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實時開通

自選配置、實時開通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問服務(wù)

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時在線

客服
熱線

400-630-3752
7*24小時客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部