濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > python 如何在list中找Topk的數(shù)值和索引

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

熱門(mén)標(biāo)簽:外呼系統(tǒng)哪些好辦 如何申請(qǐng)400電話(huà)費(fèi)用 江西省地圖標(biāo)注 武漢外呼系統(tǒng)平臺(tái) 沈陽(yáng)外呼系統(tǒng)呼叫系統(tǒng) 富錦商家地圖標(biāo)注 沈陽(yáng)人工外呼系統(tǒng)價(jià)格 池州外呼調(diào)研線(xiàn)路 沈陽(yáng)防封電銷(xiāo)卡品牌

需求:

對(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 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 算法

算法思想

首先我們要思考,我要做什么?解決什么問(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,theSmall
def 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è)參考,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • python 的topk算法實(shí)例
  • python topk()函數(shù)求最大和最小值實(shí)例
  • python list 查詢(xún)是否存在并且并返回下標(biāo)的操作
  • Python中移除List重復(fù)項(xiàng)的五種方法
  • 解決python列表list中的截取問(wèn)題

標(biāo)簽:黑龍江 阿里 常德 潛江 呂梁 株洲 銅川 通遼

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《python 如何在list中找Topk的數(shù)值和索引》,本文關(guān)鍵詞  python,如,何在,list,中找,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《python 如何在list中找Topk的數(shù)值和索引》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于python 如何在list中找Topk的數(shù)值和索引的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    信宜市| 郁南县| 临安市| 江永县| 永定县| 得荣县| 永州市| 通山县| 固安县| 乐山市| 都昌县| 河西区| 凤凰县| 义乌市| 东莞市| 托里县| 柘城县| 阿坝县| 柳河县| 龙州县| 海晏县| 门源| 山东省| 东兴市| 邹平县| 新兴县| 布拖县| 眉山市| 文登市| 舞钢市| 太和县| 白城市| 大厂| 大竹县| 泰州市| 金堂县| 西乌| 阜南县| 元朗区| 鸡泽县| 桃园县|