我在此站点上找到此代码以查找第二大数字:
def second_largest(numbers): m1, m2 = None, None 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
确实可以修改该函数以找到第二个最小的函数:
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实现可能不共享的实现细节相关联。
None
float('inf')
float('-inf')
演示:
>>> 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()函数从迭代器返回两个最小值,并从这两个中选择第二个(或最后一个)值几乎一样有效:
heapq.nsmallest()
from heapq import nsmallest def second_smallest(numbers): return nsmallest(2, numbers)[-1]
像上面的实现一样,这是一个O(N)解决方案。保持堆变量的每一步都需要logK时间,但是K在这里是一个常数(2)!无论您做什么, 都不要使用sort ;这需要O(NlogN)时间。