小编典典

Python-查找第二个最小数字

python

我在此站点上找到此代码以查找第二大数字:

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

阅读 258

收藏
2020-12-20

共1个答案

小编典典

确实可以修改该函数以找到第二个最小的函数:

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 nsmallest

def second_smallest(numbers):
    return nsmallest(2, numbers)[-1]

像上面的实现一样,这是一个O(N)解决方案。保持堆变量的每一步都需要logK时间,但是K在这里是一个常数(2)!无论您做什么, 都不要使用sort
;这需要O(NlogN)时间。

2020-12-20