Python 有没有更干净的方法来查找字典中最高的5个值?
现在,我在我的整个字典中循环了五次,每次迭代后保留最大值并删除条目。但这似乎是一个非常讨厌的方式来做我想做的事。基本上,我想获得字典的前5个最大值,并返回键,有没有更好的方法来实现这一点,而不是重复五次?是的,使用: 这比重复循环或排序更有效 heapq算法将在密钥上直接循环,在一个堆中只保留5个密钥,保持不变,然后循环完成后返回这5个元素的排序顺序。循环是O(N),保持循环不变的是O(logK)(其中K是堆大小),排序是O(KlogK)。总复杂度:O(NlogK) 排序需要对完整字典进行排序,即O(NlogN)。这意味着N越大,Python 有没有更干净的方法来查找字典中最高的5个值?,python,dictionary,Python,Dictionary,现在,我在我的整个字典中循环了五次,每次迭代后保留最大值并删除条目。但这似乎是一个非常讨厌的方式来做我想做的事。基本上,我想获得字典的前5个最大值,并返回键,有没有更好的方法来实现这一点,而不是重复五次?是的,使用: 这比重复循环或排序更有效 heapq算法将在密钥上直接循环,在一个堆中只保留5个密钥,保持不变,然后循环完成后返回这5个元素的排序顺序。循环是O(N),保持循环不变的是O(logK)(其中K是堆大小),排序是O(KlogK)。总复杂度:O(NlogK) 排序需要对完整字典进行排序,
heapq.nlargest()
赢得的性能越高。是,通过使用:
这比重复循环或排序更有效
heapq算法将在密钥上直接循环,在一个堆中只保留5个密钥,保持不变,然后循环完成后返回这5个元素的排序顺序。循环是O(N),保持循环不变的是O(logK)(其中K是堆大小),排序是O(KlogK)。总复杂度:O(NlogK)
排序需要对完整字典进行排序,即O(NlogN)。这意味着N越大,
heapq.nlargest()
赢得的性能越高。试着获得前5个值:
sorted(mydict.values())[-5:]
并获取相应的密钥:
sorted(mydict, key=mydict.get)[-5:]
尝试此操作以获得前5个值:
sorted(mydict.values())[-5:]
并获取相应的密钥:
sorted(mydict, key=mydict.get)[-5:]
但他想要的是钥匙,而不是价值观。@TimPietzcker我误解了这个问题,现在已经解决了,但他想要的是钥匙,而不是价值观。@TimPietzcker我误解了这个问题,现在已经解决了+1很好的答案!我有一个问题-在上面的代码中声明堆的大小为5是否正确?如果是,则
O(N log K)
变为O(N log 5)
,即O(N)
。或者相反,如果堆的大小是N
,那么我们回到O(N log N)
。哪个语句是正确的?这里K被固定为5,是的,但是对于所有前K个比较,您需要保持K为一个变量。是的,与N相比,注意K也很重要,因为K接近N,所以最大的方法变得不那么吸引人。事实上,nlargest()
实现。为了完整性起见:在评测前后都提出了一个类似的问题,即使用bisect
和k
长度列表比使用heapq
@ÓscarLópez更快:我希望看到重新测试;heapq
和bisect
都有可选的C实现来备份主要算法,其中提到了这些算法是否存在和正在使用。请注意,对分法不使用键功能,顺便说一句+1个很好的答案!我有一个问题-在上面的代码中声明堆的大小为5是否正确?如果是,则O(N log K)
变为O(N log 5)
,即O(N)
。或者相反,如果堆的大小是N
,那么我们回到O(N log N)
。哪个语句是正确的?这里K被固定为5,是的,但是对于所有前K个比较,您需要保持K为一个变量。是的,与N相比,注意K也很重要,因为K接近N,所以最大的方法变得不那么吸引人。事实上,nlargest()
实现。为了完整性起见:在评测前后都提出了一个类似的问题,即使用bisect
和k
长度列表比使用heapq
@ÓscarLópez更快:我希望看到重新测试;heapq
和bisect
都有可选的C实现来备份主要算法,其中提到了这些算法是否存在和正在使用。请注意,对分法不使用键功能,顺便说一句。