2014-02-25 14 views

回答

7

是,通過使用heapq.nlargest() function

from heapq import nlargest 

five_largest = nlargest(5, yourdict, key=yourdict.get) 

這比任一重複循環排序更有效。

heapq算法會對鍵進行一個循環,只保留其中的5個保持不變的堆,然後當循環完成時返回這5個元素的排序順序。循環是O(N),保持循環不變是O(logK)(其中K是堆大小),排序O(KlogK)。總複雜度:O(NlogK)

排序將需要排序完整字典,它是O(NlogN)。這意味着N越大,heapq.nlargest()贏得的成績就越多。

+0

+1偉大的答案!我有一個問題 - 在上面的代碼中聲明堆的大小是5將是正確的嗎?如果是的話,則'O(N log K)'變爲'O(N log 5)',即'O(N)'。或者相反,如果堆的大小是「N」,那麼我們又回到了'O(N log N)'。哪一種說法是正確的? –

+1

這裏K固定爲5,是的,但是對於所有Top K比較,您需要將K保留一個變量。是的,與N相比,注意K也很重要,因爲當K接近N時,「最大」方法變得不那麼吸引人。實際上,'nlargest()'實現[在N> = K]時切換到使用'sorted()'(http://hg.python.org/cpython/file/0926adcc335c/Lib/heapq.py#l452) 。 –

+0

爲了完整起見,在分析它之前和之後詢問了一個類似的問題[總結](http://stackoverflow.com/a/350685/201359),使用帶有「k」長度列表的「bisect」的速度比使用'heapq'。 –

1

嘗試使用此方法獲得前5個值:

sorted(mydict.values())[-5:] 

並獲得相應的鍵:

sorted(mydict, key=mydict.get)[-5:] 
+0

但他想要的是鑰匙,而不是價值。 –

+0

@TimPietzcker我誤解了這個問題,現在已經修復 –

相關問題