[英]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_k
和max_v
留給您剛剛找到的鍵值對。
由於這是最大值,字典中沒有其他值會更大。 因此,在循環結束時,您仍將擁有相同的max_k
和max_v
。 然后你會再次嘗試del dic[max_k]
,它會引發一個KeyError
,因為你已經刪除了它。
解決方案很簡單:將設置max_k
和max_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)
時間。 如果k
比n
小很多,你可以通過使用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.