Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:从一些列表中获取最大N个元素_Python_Max - Fatal编程技术网

Python:从一些列表中获取最大N个元素

Python:从一些列表中获取最大N个元素,python,max,Python,Max,有没有函数可以从列表中返回N个最高的元素 也就是说,如果max(l)返回单个最高的元素,那么像max(l,count=10)这样的东西会返回一个包含10个最高数字的列表(如果l较小,则返回的数字会更少) 或者什么是一个有效的简单方法来获得这些?(除了明显的规范化实现之外;而且,没有涉及首先对整个列表进行排序的事情,因为与规范化解决方案相比,这是低效的。)一个相当有效的解决方案是一种快速排序的变体,其中递归仅限于轴的右侧部分,直到轴点位置高于所需的元素数(当然,还有一些额外的条件来处理边界情况)

有没有函数可以从列表中返回N个最高的元素

也就是说,如果
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]