如何有效地获得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模块 曼努埃尔
使用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) ]
+1:我不知道abt这个模块...谢谢 – mshsayem 2010-02-11 09:55:59
伟大的语言排名:)) – 2016-01-17 11:57:18
可以使用heapq
模块。
>>> from heapq import heapify, nlargest
>>> l = [9,1,6,4,2,8,3,7,5]
>>> heapify(l)
>>> nlargest(3, l)
[9, 8, 7]
>>>
我们不需要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.nlargest
takes O(n log k) time,这可能会或可能不够好。如果k = O(n),那么所有3种算法都具有相同的复杂性(即不打扰),如果k = 0(log n),则*中描述的选择算法是O(n )和heapq.nlargest
是O(n log log n),但是对于大多数实际来说,双对数是“足够恒定的”,这与它无关紧要。)
+1现在基本目的被服务了,高尔夫球? – 2010-02-11 10:41:52