簡體   English   中英

Python 沒有結果和 KeyError:1

[英]Python got no result and KeyError:1

def fre(dic, k):
    max_k = dic.keys()[0]
    max_v = dic.values()[0]
    while len(dic2) < k:
        for key, value in dic.items():
            if max_v < value:
                max_k = key
                max_v = value

        dic2[max_k] = max_v
        del dic[max_k]
    return dic2
# dic is a dictionary, k is an int

這道題是獲取dic中的k個最大值,並獲取匹配的key:value對。 但是我遇到了運行問題並得到了 KeyError: 1。

問題是,每次循環時,您將max_kmax_v留給您剛剛找到的鍵值對。

由於這是最大值,字典中沒有其他值會更大。 因此,在循環結束時,您仍將擁有相同的max_kmax_v 然后你會再次嘗試del dic[max_k] ,它會引發一個KeyError ,因為你已經刪除了它。

解決方案很簡單:將設置max_kmax_v為第一個元素的代碼移到外循環中,這樣它每次都運行,而不是第一次運行:

while len(dic2) < k:
    max_k = dic.keys()[0]
    max_v = dic.values()[0]

    for key, value in dic.items():
        if max_v < value:
            max_k = key
            max_v = value

    dic2[max_k] = max_v
    del dic[max_k]

但是,雖然我們正在這樣做,但有更簡單(或至少更難弄巧成拙)的方法來做到這一點。

最明顯的是按 value 對項目進行排序,然后取第一個k

import operator

def fre(dic, k):
    return dict(sorted(dic.items(), key=operator.itemgetter(1), reverse=True)[:k])

有關關鍵函數如何工作以及itemgetter ,請參閱Sorting HOWTO

但是你可以使這更有效。 sorted顯然必須對所有n值進行排序,只是為了得到前k ,所以它需要O(n)空間和O(n log n)時間。 如果kn小很多,你可以通過使用heapq.nlargest做得更好, heapq.nlargest需要O(k)空間和O(n log k)時間:

import heapq
import operator

def fre(dic, k):
    return dict(heapq.nlargest(k, dic.items(), key=operator.itemgetter(1)))

無論哪種方式,這都不會從dic刪除鍵; 如果需要,您可以手動執行此操作:

def fre(dic, k):
    dic2 = dict(heapq.nlargest(k, dic.items(), key=operator.itemgetter(1)))
    for key in dic2:
        del dic[key]
    return dic2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM