Python:从一些列表中获取最大N个元素
有没有函数可以从列表中返回N个最高的元素 也就是说,如果Python:从一些列表中获取最大N个元素,python,max,Python,Max,有没有函数可以从列表中返回N个最高的元素 也就是说,如果max(l)返回单个最高的元素,那么像max(l,count=10)这样的东西会返回一个包含10个最高数字的列表(如果l较小,则返回的数字会更少) 或者什么是一个有效的简单方法来获得这些?(除了明显的规范化实现之外;而且,没有涉及首先对整个列表进行排序的事情,因为与规范化解决方案相比,这是低效的。)一个相当有效的解决方案是一种快速排序的变体,其中递归仅限于轴的右侧部分,直到轴点位置高于所需的元素数(当然,还有一些额外的条件来处理边界情况)
max(l)
返回单个最高的元素,那么像max(l,count=10)
这样的东西会返回一个包含10个最高数字的列表(如果l
较小,则返回的数字会更少)
或者什么是一个有效的简单方法来获得这些?(除了明显的规范化实现之外;而且,没有涉及首先对整个列表进行排序的事情,因为与规范化解决方案相比,这是低效的。)一个相当有效的解决方案是一种快速排序的变体,其中递归仅限于轴的右侧部分,直到轴点位置高于所需的元素数(当然,还有一些额外的条件来处理边界情况)
正如其他人在这里指出的,标准库具有
heapq.nlagest
。从L的前10个开始,称为X。注意最小值X
在L[i]上循环,因为i在L的其余部分上循环
如果L[i]大于min(X),则从X中删除min(X)并插入L[i]。您可能需要将X保留为已排序的链表并进行插入。更新最小值(X)
最后,您将得到X中的10个最大值
由于插入排序是线性的,所以我猜想将是O(kN)(这里k是10)。可能是gsl使用的,所以如果您可以阅读一些C代码:
可能是numpy中的某些东西做到了这一点。:
标准库中执行此操作的函数可能与heapq.nlargest重复,但在我的系统中,排序(l)[:count]更快,直到列表达到25000个元素。排序(l,reverse=True)[0:N]是的,这就是我对明显的规范解决方案的意思。:)(基本上是一种广义的
min
算法。)
>>> import heapq, random
>>> heapq.nlargest(3, (random.gauss(0, 1) for _ in xrange(100)))
[1.9730767232998481, 1.9326532289091407, 1.7762926716966254]