我在这个网站上找到了这个代码来查找第二大号码:

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

资料来源:Get the second largest number in a list in linear time
是否可以修改此代码以找到第二个最小的数字?比如说
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实现可能不共享的实现细节。
演示:
>>> 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() function返回iterable中的两个最小值和从这两个值中选择第二个(或最后一个)值几乎同样有效:
from heapq import nsmallest

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

像上面的实现一样,这是一个O(N)解决方案;保持堆变量的每一步都需要日志时间,但这里的k是常量(2)!无论你做什么,都不要使用排序;这需要O(nlogn)时间。

关于python - Python - 查找第二个最小的数字,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26779618/

10-13 09:12