【问题标题】:how to efficiently get the k bigger elements of a list in python如何在python中有效地获取列表的k个更大的元素
【发布时间】:2011-01-15 15:47:52
【问题描述】:

解决这个问题的最有效、最优雅和 Pythonic 的方法是什么?

给定一个包含 n 个元素的列表(或集合或其他),我们想要获得最大的 k 个元素。 (你可以假设k<n/2 不失一般性,我猜) 例如,如果列表是:

l = [9,1,6,4,2,8,3,7,5]

n = 9,假设 k = 3。 检索 3 个最大的最有效的算法是什么? 在这种情况下,我们应该得到[9,8,7],没有特别的顺序。

谢谢! 曼努埃尔

【问题讨论】:

  • +1 既然已经达到了基本目的,那就让 CODE-GOLF 出现吧?

标签: algorithm sorting performance python


【解决方案1】:
l = [9,1,6,4,2,8,3,7,5]

sorted(l)[-k:]

【讨论】:

    【解决方案2】:

    使用 heapq 模块中的 nlargest

    from heapq import nlargest
    lst = [9,1,6,4,2,8,3,7,5]
    nlargest(3, lst) # Gives [9,8,7]
    

    如果你想改变你的标准,你也可以给 nlargest 一个键:

    from heapq import nlargest
    tags = [ ("python", 30), ("ruby", 25), ("c++", 50), ("lisp", 20) ]
    nlargest(2, tags, key=lambda e:e[1]) # Gives [ ("c++", 50), ("python", 30) ]
    

    【讨论】:

    • 很棒的语言排名:))
    • 是否保证nlargest() 会按照上面示例中提到的排序顺序返回项目?在文档中找不到这个,所以我想,没有这样的保证
    • ^ 好吧,我刚看了源代码,似乎输出总是会排序的。不错!
    【解决方案3】:

    您可以使用heapq 模块。

    >>> from heapq import heapify, nlargest
    >>> l = [9,1,6,4,2,8,3,7,5]
    >>> heapify(l)
    >>> nlargest(3, l)
    [9, 8, 7]
    >>> 
    

    【讨论】:

    • 这里不需要堆砌
    【解决方案4】:
    sorted(l, reverse=True)[:k]
    

    【讨论】:

      【解决方案5】:

      简单的 O(n log n) 方法是对列表进行排序,然后获取最后的 k 个元素。

      正确的方法是使用selection algorithm,它的运行时间为 O(n + k log k)。

      另外,heapq.nlargesttakes O(n log k) time on average,可能不够好,也可能不够好。

      (如果 k = O(n),那么所有 3 种算法的复杂度都相同(即不要打扰)。如果 k = O(log n),那么维基百科中描述的选择算法是 O(n) heapq.nlargest 是 O(n log log n),但是对于大多数实际的 n 来说,双对数“足够恒定”,这并不重要。)

      【讨论】:

      • 来自答案中 nlargest 的链接,时间复杂度似乎是 O(n log(k)) 而不是 O(k log(n))
      猜你喜欢
      • 1970-01-01
      • 2011-01-09
      • 2013-02-11
      • 2014-10-26
      • 1970-01-01
      • 1970-01-01
      • 2013-09-13
      • 2021-08-29
      • 1970-01-01
      相关资源
      最近更新 更多