【问题标题】:How to find k biggest numbers from a list of n numbers assuming n > k假设n> k,如何从n个数字的列表中找到k个最大的数字
【发布时间】:2013-07-28 09:45:23
【问题描述】:

我正在寻找一些 Python 代码,它可以从 n 数字的未排序列表中返回最大的数字 k。首先,我想通过首先对列表进行排序来做到这一点,但这可能会变得非常庞大。

例如我要查找k最大数的列表是list1

> list1 = [0.5, 0.7, 0.3, 0.3, 0.3, 0.4, 0.5]

这里是n = 7,如果是k = 3,也就是说,如果我想从7个数字的列表中找到3个最大的数字,那么输出应该是0.5, 0.7, 0.5

如何做到这一点?

【问题讨论】:

  • 我想要python的代码。其他指向 C 的链接。
  • 不,他提供的链接中没有一行代码,只是要遵循的程序。你可以很容易地把它变成 Python。
  • 这个过程似乎很难理解,因为我是编程和 python 的新手。我想知道是否有某种方式可以使用 max 函数来立即获得所需的输出。此外,我正在参加一个编程锦标赛,我只能创建自己的函数:(
  • 在这种情况下,向 SO 询问实际代码而不是指针将是作弊......

标签: python list max


【解决方案1】:

Python 包含所有电池 - 使用 heapq 模块 :)

from heapq import nlargest

data = [0.5, 0.7, 0.3, 0.3, 0.3, 0.4, 0.5]
print nlargest(3, data)

它也比对整个数组排序更快,因为它使用部分堆排序

【讨论】:

  • 这是一个更好的解决方案。我花了大约一年的时间才弄明白。
  • 如果你对索引感兴趣,你可以使用'key'参数。 nlargest(3, range(len(data)), key=lambda idx: data[idx]).
【解决方案2】:

可以这样做:

>>> list1
[0.5, 0.7, 0.3, 0.3, 0.3, 0.4, 0.5]
>>> list2 = list1[:] #make a copy of list1
>>> k = 3
>>> result = []
>>> for i in range(k):
        result.append(max(list2)) #append largest element to list of results
        list2.remove(max(list2)) # remove largest element from old list
>>> result
[0.7, 0.5, 0.5]
>>> 

【讨论】:

    【解决方案3】:

    假设你不想修改list1,你复制一个sorted

    In [1]: list1 = [0.5, 0.7, 0.3, 0.3, 0.3, 0.4, 0.5]
    
    In [2]: list2 = sorted(list1)
    
    In [3]: list2
    Out[3]: [0.3, 0.3, 0.3, 0.4, 0.5, 0.5, 0.7]
    

    list2中,最大的数字是最后一个数字,所以我们将使用slicing

    In [4]: list2[-3:]
    Out[4]: [0.5, 0.5, 0.7]
    

    我添加的链接指向 Pythons documentation。作为初学者,您应该先看看tutorial。在那之后,library reference 是您最需要的,因为大型标准库是使 python 如此出色的原因之一。

    【讨论】:

    • 非常感谢。这正是我想要的。当存在一个不错的 sorted(list1) 函数时,我非常努力地对列表进行排序。再次感谢!!!
    【解决方案4】:

    另一种解决方案:

    import numpy as np
    k = 3
    ind = np.argpartition(list1, -k)[-k:] # index of the k highest elements
    print(list1[ind])
    

    【讨论】:

    • 我很欣赏这个答案,因为我相信它应该比其他解决方案花费更少的时间(尽管我没有严格地与其他解决方案一起“计时”)。现在,一个附属问题:这个索引是否可以排序为先取最高索引,然后取第二高,依此类推?
    【解决方案5】:

    不排序,使用贪心方法

    k_largest = list1[:k]
    for num in list1:
        for c in range(k):
            if num > k_largest[c]:
                k_largest = k_largest[:c] + [num] + k_largest[c:-1]  # maintains sorted order
                break
    print(k_largest)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-08
      • 1970-01-01
      • 2016-03-20
      • 1970-01-01
      • 1970-01-01
      • 2018-08-11
      • 2010-12-06
      相关资源
      最近更新 更多