代码之家  ›  专栏  ›  技术社区  ›  Albert

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

  •  33
  • Albert  · 技术社区  · 14 年前

    有什么函数可以返回某个列表中N个最高的元素吗?

    一、 e.如果 max(l) 返回单个最高元素,如 max(l, count=10) 会给我一个10个最高数字的列表(如果 l 更小)。

    或者什么样的方法更容易得到这些?(除了明显的规范实现之外;而且,没有这样的事情需要首先对整个列表进行排序,因为与规范解决方案相比,这将是低效的。)

    4 回复  |  直到 14 年前
        1
  •  55
  •   Gareth Rees    14 年前

    heapq.nlargest :

    >>> import heapq, random
    >>> heapq.nlargest(3, (random.gauss(0, 1) for _ in xrange(100)))
    [1.9730767232998481, 1.9326532289091407, 1.7762926716966254]
    
        2
  •  6
  •   David Webb    14 年前

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

        3
  •  3
  •   Spacedman    14 年前

    从L的前10开始,称之为X。注意X的最小值。

    把我的身体绕过去。

    如果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

    可能是纽比的某个地方做的。

        4
  •  1
  •   Gintautas Miliauskas    14 年前

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

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