如何返回另一個列表中3個最低值的列表。例如,我想這個名單的3個最低值:如何返回另一個列表中3個最低值的列表
in_list = [1, 2, 3, 4, 5, 6]
input: function(in_list, 3)
output: [1, 2, 3]
如何返回另一個列表中3個最低值的列表。例如,我想這個名單的3個最低值:如何返回另一個列表中3個最低值的列表
in_list = [1, 2, 3, 4, 5, 6]
input: function(in_list, 3)
output: [1, 2, 3]
您可以使用heapq.nsmallest
:
>>> from heapq import nsmallest
>>> in_list = [1, 2, 3, 4, 5, 6]
>>> nsmallest(3, in_list)
[1, 2, 3]
>>>
如果你的名單很長,這樣做的最有效的方法是通過numpy.partition
:
>>> def lowest(a, n): return numpy.partition(a, n-1)[:n]
>>> in_list = [6, 4, 3, 2, 5, 1]
>>> lowest(in_list, 3)
array([1, 2, 3])
此執行O(N)時間,不同於全排序這將在O(NlogN)時間運行。節省的時間來自未執行完整排序,但只有確保最低元素排在第一位所需的最小量。因此,輸出不一定是排序的。
如果您需要對它們進行排序,則可以在此後執行此操作(numpy.sort(lowest(in_list,3)) => array([1,2,3])
)。對於大數組,這仍然比首先排序整個事物更快。
編輯:以下爲numpy.partition
,heapq.nsmallest
和sorted
速度的比較:
>>> a = numpy.random.permutation(np.arange(1000000))
>>> timeit numpy.partition(a, 2)[:3]
100 loops, best of 3: 3.32 ms per loop
>>> timeit heapq.nsmallest(3,a)
1 loops, best of 3: 220 ms per loop
>>> timeit sorted(a)[:3]
1 loops, best of 3: 1.18 s per loop
所以numpy.partition
比heapq.nsmallest
更快用於與一百萬個元素的數組66倍,它比快355倍sorted
。這並不意味着你永遠不應該使用heapq.nsmallest
(這是非常靈活的),但它表明,當速度很重要時避免簡單列表是多麼重要。
這會將原始列表轉換爲一個'np.array()'對象。 –
請注意,heapq.nsmallest()會按照大致相同的順序執行相同的操作,加上排序,它需要O(NlogK)時間,其中K是要返回的元素的數量。 'numpy.partition()'和'heapq'都由C代碼支持。 heapq然後返回一個Python列表的事實可以被看作是優於'numpy.partition()'的優勢。 –
是的。但是,如果你的列表很長,你想要使用數組而不是列表,因爲它們速度更快並且使用更少的內存。如果你想讓輸出成爲一個普通的列表,只需要執行'list(lowest(in_list,3))'。 – amaurea
如果你能排序,你可以得到FRST如下3個要素:
alist=[6, 4, 3, 2, 5, 1]
sorted(alist)[:3]
輸出:
[1,2,3]
更簡單,而不導入模塊:
l =[3,8,9,10,2,4,1]
l1 = sorted(l)[:3]
希望這有助於
可以有多個wa YS。你想出了什麼方法? – devnull