我在这个网站上找到了这个代码来找到第二大数字:
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)时间.
确实可以修改该函数以找到第二个最小的函数:
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)时间.
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]
或者只使用heapq
import heapq def second_largest(numbers): return heapq.nsmallest(2, numbers)[-1] second_largest([1, 2, 3, 4]) # Output: 2