是否有某些功能可以从某些列表中返回N个最高元素?
即。如果max(l)
返回单个最高元素,那么......像max(l, count=10)
一样会返回10个最高数字的列表(如果l
更小则会更少)。
或者什么是一种有效的简单方法来获得这些? (除了明显的规范实现;也没有涉及首先对整个列表进行排序的事情,因为与规范解决方案相比,这将是低效的。)
答案 0 :(得分:52)
>>> 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
,正如其他人所指出的那样。