Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有没有更干净的方法来查找字典中最高的5个值?_Python_Dictionary - Fatal编程技术网

Python 有没有更干净的方法来查找字典中最高的5个值?

Python 有没有更干净的方法来查找字典中最高的5个值?,python,dictionary,Python,Dictionary,现在,我在我的整个字典中循环了五次,每次迭代后保留最大值并删除条目。但这似乎是一个非常讨厌的方式来做我想做的事。基本上,我想获得字典的前5个最大值,并返回键,有没有更好的方法来实现这一点,而不是重复五次?是的,使用: 这比重复循环或排序更有效 heapq算法将在密钥上直接循环,在一个堆中只保留5个密钥,保持不变,然后循环完成后返回这5个元素的排序顺序。循环是O(N),保持循环不变的是O(logK)(其中K是堆大小),排序是O(KlogK)。总复杂度:O(NlogK) 排序需要对完整字典进行排序,

现在,我在我的整个字典中循环了五次,每次迭代后保留最大值并删除条目。但这似乎是一个非常讨厌的方式来做我想做的事。基本上,我想获得字典的前5个最大值,并返回键,有没有更好的方法来实现这一点,而不是重复五次?

是的,使用:

这比重复循环或排序更有效

heapq算法将在密钥上直接循环,在一个堆中只保留5个密钥,保持不变,然后循环完成后返回这5个元素的排序顺序。循环是O(N),保持循环不变的是O(logK)(其中K是堆大小),排序是O(KlogK)。总复杂度:O(NlogK)

排序需要对完整字典进行排序,即O(NlogN)。这意味着N越大,
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实现来备份主要算法,其中提到了这些算法是否存在和正在使用。请注意,对分法不使用键功能,顺便说一句。