如何在python中有效地获取列表中k个更大的元素

时间:2010-02-11 09:47:17

标签: algorithm sorting performance python

解决这个问题的最有效,优雅和pythonic的方法是什么?

给定n个元素的列表(或集合或其他),我们希望得到k个最大元素。 (你可以假设k<n/2而不失一般性,我猜) 例如,如果列表是:

l = [9,1,6,4,2,8,3,7,5]

n = 9,假设k = 3。 检索3个最大的算法的最有效算法是什么? 在这种情况下,我们应该得到[9,8,7],没有特别的顺序。

谢谢! 曼努埃尔

5 个答案:

答案 0 :(得分:45)

使用heapq模块中的nlargest

from heapq import nlargest
lst = [9,1,6,4,2,8,3,7,5]
nlargest(3, lst) # Gives [9,8,7]

如果您想更改标准,也可以给出一个关键词:

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) ]

答案 1 :(得分:10)

简单的O(n log n)方法是对列表进行排序,然后获取最后的 k 元素。

正确的方法是使用selection algorithm,它在O(n + k log k)时间内运行。

此外,heapq.nlargest takes O(n log k) time,可能也可能不够好。

(如果k = O(n),那么所有3种算法都具有相同的复杂度(即不要打扰)。如果k = O(log n),那么维基百科中描述的选择算法是O(n)并且heapq.nlargest是O(n log log n),但是对于大多数实际的 n 来说,双对数是“足够常数”并不重要。)

答案 2 :(得分:7)

l = [9,1,6,4,2,8,3,7,5]

sorted(l)[-k:]

答案 3 :(得分:4)

您可以使用heapq模块。

>>> from heapq import heapify, nlargest
>>> l = [9,1,6,4,2,8,3,7,5]
>>> heapify(l)
>>> nlargest(3, l)
[9, 8, 7]
>>> 

答案 4 :(得分:4)

sorted(l, reverse=True)[:k]