我正在寻找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
如何做到这一点?
答案 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)