2014-03-01 58 views

回答

7

您可以使用heapq.nsmallest

>>> from heapq import nsmallest 
>>> in_list = [1, 2, 3, 4, 5, 6] 
>>> nsmallest(3, in_list) 
[1, 2, 3] 
>>> 
1

如果你的名單很長,這樣做的最有效的方法是通過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.partitionheapq.nsmallestsorted速度的比較:

>>> 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.partitionheapq.nsmallest更快用於與一百萬個元素的數組66倍,它比快355倍sorted。這並不意味着你永遠不應該使用heapq.nsmallest(這是非常靈活的),但它表明,當速度很重要時避免簡單列表是多麼重要。

+0

這會將原始列表轉換爲一個'np.array()'對象。 –

+0

請注意,heapq.nsmallest()會按照大致相同的順序執行相同的操作,加上排序,它需要O(NlogK)時間,其中K是要返回的元素的數量。 'numpy.partition()'和'heapq'都由C代碼支持。 heapq然後返回一個Python列表的事實可以被看作是優於'numpy.partition()'的優勢。 –

+0

是的。但是,如果你的列表很長,你想要使用數組而不是列表,因爲它們速度更快並且使用更少的內存。如果你想讓輸出成爲一個普通的列表,只需要執行'list(lowest(in_list,3))'。 – amaurea

3

如果你能排序,你可以得到FRST如下3個要素:

alist=[6, 4, 3, 2, 5, 1] 
sorted(alist)[:3] 

輸出:

[1,2,3] 
1

更簡單,而不導入模塊:

l =[3,8,9,10,2,4,1] 
l1 = sorted(l)[:3] 

希望這有助於

相關問題