如何以最高效、优雅且符合 Python 风格的方式解决这个问题?
给定一个包含 n 个元素的列表(或集合等),我们想要得到其中前 k 大的元素。(你可以假设 k<n/2
而不失一般性,我猜)例如,如果这个列表是:
l = [9,1,6,4,2,8,3,7,5]
假设n=9,k=3,那么如何高效地检索到前三个最大值呢?返回的结果应该是[9,8,7]
,顺序不限。
谢谢! Manuel
如何以最高效、优雅且符合 Python 风格的方式解决这个问题?
给定一个包含 n 个元素的列表(或集合等),我们想要得到其中前 k 大的元素。(你可以假设 k<n/2
而不失一般性,我猜)例如,如果这个列表是:
l = [9,1,6,4,2,8,3,7,5]
假设n=9,k=3,那么如何高效地检索到前三个最大值呢?返回的结果应该是[9,8,7]
,顺序不限。
谢谢! Manuel
使用heapq模块中的nlargest函数
from heapq import nlargest
lst = [9,1,6,4,2,8,3,7,5]
nlargest(3, lst) # Gives [9,8,7]
如果你想更改排序的标准,你还可以给nlargest方法传递一个关键字参数:
from heapq import nlargest
tags = [ ("python", 30), ("ruby", 25), ("c++", 50), ("lisp", 20) ]
nlargest(2, tags, key=lambda e:e[1]) # Gives [ ("c++", 50), ("python", 30) ]
nlargest()
会按照上述示例中提到的排序顺序返回项目吗?我在文档中找不到相关说明,所以我猜测没有这样的保证。 - Vikas Prasadheapq.nlargest
平均需要O(n log k)时间,这可能足够好,也可能不够好。heapq.nlargest
是O(n log log n),但双对数对于大多数实际n来说已经足够"常数化"了,所以不用担心。)l = [9,1,6,4,2,8,3,7,5]
sorted(l)[-k:]
heapq
模块。>>> from heapq import heapify, nlargest
>>> l = [9,1,6,4,2,8,3,7,5]
>>> heapify(l)
>>> nlargest(3, l)
[9, 8, 7]
>>>
sorted(l, reverse=True)[:k]