Python:从某些列表中获取最多N个元素

时间:2010-11-18 13:54:56

标签: python max

是否有某些功能可以从某些列表中返回N个最高元素?

即。如果max(l)返回单个最高元素,那么......像max(l, count=10)一样会返回10个最高数字的列表(如果l更小则会更少)。

或者什么是一种有效的简单方法来获得这些? (除了明显的规范实现;也没有涉及首先对整个列表进行排序的事情,因为与规范解决方案相比,这将是低效的。)

4 个答案:

答案 0 :(得分:52)

heapq.nlargest

>>> import heapq, random
>>> heapq.nlargest(3, (random.gauss(0, 1) for _ in xrange(100)))
[1.9730767232998481, 1.9326532289091407, 1.7762926716966254]

答案 1 :(得分:6)

执行此操作的标准库中的函数是heapq.nlargest

答案 2 :(得分:3)

从L的前10个开始,调用X.注意X的最小值。

在L的其余部分循环L [i]为i。

如果L [i]大于min(X),则从X下降min(X)并插入L [i]。您可能需要将X保留为已排序的链接列表并进行插入。更新min(X)。

最后,X中有10个最大值。

我怀疑这将是O(kN)(其中k是10),因为插入排序是线性的。可能是gsl使用的,所以如果你能阅读一些C代码:

http://www.gnu.org/software/gsl/manual/html_node/Selecting-the-k-smallest-or-largest-elements.html

可能是numpy中有这样做的东西。

答案 3 :(得分:1)

一种相当有效的解决方案是快速排序的变体,其中递归仅限于枢轴的右侧部分,直到枢轴点位置高于所需的元素数量(当然还有一些额外的条件来处理边界情况)

标准库有heapq.nlargest,正如其他人所指出的那样。