确实可以修改该函数以找到第二个最小的函数:
def second_smallest(numbers): m1, m2 = float('inf'), float('inf') for x in numbers: if x <= m1: m1, m2 = x, m1 elif x < m2: m2 = x return m2旧版本依赖于Python
2实施细节,该细节
None始终排在其他任何东西之前(因此测试为“较小”);我取代了使用
float('inf')作为前哨,为无穷大总是测试,更大的
比任何其它号码。理想情况下,应该使用原始函数
float('-inf')代替原始函数None,以免与其他Python实现可能不共享的实现细节相关联。
演示:
>>> def second_smallest(numbers):... m1, m2 = float('inf'), float('inf')... for x in numbers:... if x <= m1:... m1, m2 = x, m1... elif x < m2:... m2 = x... return m2... >>> print second_smallest([1, 2, 3, 4])2在您发现的函数之外,使用该
heapq.nsmallest()函数从迭代器返回两个最小值,并从这两个中选择第二个(或最后一个)值几乎一样有效:
from heapq import nsmallestdef second_smallest(numbers): return nsmallest(2, numbers)[-1]
像上面的实现一样,这是一个O(N)解决方案。保持堆变量的每一步都需要logK时间,但是K在这里是一个常数(2)!无论您做什么, 都不要使用sort
;这需要O(NlogN)时间。



