2014-11-06 55 views
0

是否有比其他排序方式()找到此行的第二個最小整數:找到第二個最小整數(蟒蛇)

10 12 2 5 15 
+0

'排序('10 12 2 5 15'.split(),反向=真)[1]' – Hackaholic 2014-11-06 17:49:34

+0

排序是絕對不是無論如何要做到這一點的最佳方式,因爲它整理了整個清單 - 這是浪費。 – will 2014-11-06 17:51:44

+0

@ will除非您評估您的確切用例的性能,並且意外地發現它是最有效的方式。 – moooeeeep 2014-11-06 17:53:42

回答

1

您可以使用heapq.nsmalles

>>> import heapq 
>>> l=[10, 12, 2, 5 ,15] 
>>> print(heapq.nsmallest(2, l)) [1] 
5 

最堆的重要特徵是heap[0]始終是最小的項目。使用heapq.heappop()方法可以很容易地找到後續項目,其中 會彈出第一個項目並將其替換爲下一個最小項目( 需要O(log N)操作的操作,其中N是堆)

nlargest()nsmallest()函數是最合適的,如果你正試圖 找到一個相對較少的項目。如果您只是試圖找到單個最小的 或最大的項目(N = 1),則使用min()max()會更快。類似地,如果N大約與集合本身的大小相同,則通常將其首先排序並採取分片(即, 使用sorted(items)[:N]sorted(items)[-N:])更快。應該注意的是,nlargest()nsmallest()的實際 實現是自適應的,它會如何操作,並且 會以您的名義執行其中一些優化(例如,如果N接近於 ,則使用排序與輸入的大小相同)。 (參考文獻:蟒食譜第三版