如何从n个数字列表中找到k个最大数字,假设n> ķ

时间:2013-07-28 09:45:23

标签: python list max

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

例如,我想要查找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

如何做到这一点?

5 个答案:

答案 0 :(得分:19)

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)

它也比整个数组排序快,因为它使用了部分剪辑

答案 1 :(得分:3)

可以这样做:

>>> 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]
>>> 

答案 2 :(得分:2)

假设您不想修改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变得如此美好的事情之一。

答案 3 :(得分:0)

另一种解决方案:

{{1}}

答案 4 :(得分:0)

无需排序,使用贪婪方法

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)