我在这个网站上找到了这个代码来查找第二大号码:
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/