Python - 查找第二个最小的数字

  发布于 2022-12-12 19:01

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

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

小智.. 12

a = [6,5,4,4,2,1,10,1,2,48]
s = set(a) # used to convert any of the list/tuple to the distinct element and sorted sequence of elements
# Note: above statement will convert list into sets 
print sorted(s)[1] 

在这种情况下,代码是如此简单和不言自明,文本解释不会添加任何有用的东西. (4认同)

虽然答案可能是正确的,但请添加一些解释而不仅仅是代码转储.另外,如果我可以添加,请尝试格式化代码,以便代码行之间没有空行 (3认同)


Martijn Piet.. 11

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

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)!无论你做什么,都不要使用分类 ; 需要O(NlogN)时间.

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

    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)!无论你做什么,都不要使用分类 ; 需要O(NlogN)时间.

    2022-12-12 19:02 回答
  • a = [6,5,4,4,2,1,10,1,2,48]
    s = set(a) # used to convert any of the list/tuple to the distinct element and sorted sequence of elements
    # Note: above statement will convert list into sets 
    print sorted(s)[1] 
    

    2022-12-12 19:04 回答
  • 或者只使用heapq

    import heapq
    def second_largest(numbers):
        return heapq.nsmallest(2, numbers)[-1]
    
    second_largest([1, 2, 3, 4])
    # Output: 2
    

    2022-12-12 19:07 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有