现在,我将整个字典循环五次,并在每次迭代后保留最高值并删除条目。但这似乎是做我想做的事情的一种非常讨厌的方式。本质上,我想获得字典中前 5 个最大的值,并返回键,有没有比遍历它五次更好的方法来做到这一点?
请您参考如下方法:
是的,通过使用 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() 在性能上的优势就越大。
