现在,我循环遍历整个字典五次并在每次迭代后保持最高值并删除条目。但这似乎是一种非常讨厌的方式来做我想做的事情。基本上我想获得我的字典的前5个最大值,并返回键,有没有更好的方法来做到这一点而不是迭代它五次?
答案 0 :(得分: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()
在性能上越胜。
答案 1 :(得分:1)
尝试此操作以获得前5个值:
sorted(mydict.values())[-5:]
并获得相应的密钥:
sorted(mydict, key=mydict.get)[-5:]