2014-11-06 54 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接近于 ,则使用排序与输入的大小相同)。 (参考文献:蟒食谱第三版