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

问题描述:

解决这个问题的最高效,最优雅和最可靠的方法是什么?如何有效地获得python中列表中的k个更大的元素

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

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

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

谢谢!从heapq模块 曼努埃尔

+0

+1现在基本目的被服务了,高尔夫球? – 2010-02-11 10:41:52

使用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) ] 
+0

+1:我不知道abt这个模块...谢谢 – mshsayem 2010-02-11 09:55:59

+0

伟大的语言排名:)) – 2016-01-17 11:57:18

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

sorted(l)[-k:] 
+0

这比我的更好) – Rorick 2010-02-11 09:53:41

+0

...但它不适用于k == 0的特定情况。 :) – EOL 2010-02-11 10:27:58

可以使用heapq模块。

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

我们不需要heapify它在这里 – garg10may 2015-10-13 07:22:46

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

简单,为O(n log n)的方式是对列表进行排序,然后得到最后ķ元素。

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

另外,heapq.nlargesttakes O(n log k) time,这可能会或可能不够好。如果k = O(n),那么所有3种算法都具有相同的复杂性(即不打扰),如果k = 0(log n),则*中描述的选择算法是O(n )和heapq.nlargest是O(n log log n),但是对于大多数实际来说,双对数是“足够恒定的”,这与它无关紧要。)