由于@OscarLopez和我对第二大含义是什么有不同的看法,因此我将根据自己的解释并按照发问者提供的第一种算法发布代码。
def second_largest(numbers): count = 0 m1 = m2 = float('-inf') for x in numbers: count += 1 if x > m2: if x >= m1: m1, m2 = x, m1 else: m2 = x return m2 if count >= 2 else None
(注意:此处使用负无穷大,而不是
None因为
None在Python 2和3中具有不同的排序行为-请参阅Python-
查找第二个最小的数字;检查其中的元素数
numbers可确保当实际的负无穷大时不会返回答案是不确定的。)
如果最大值多次出现,那么它可能也是第二大最大值。关于这种方法的另一件事是,如果元素少于两个,则它可以正常工作;那么没有第二大的。
运行相同的测试:
second_largest([20,67,3,2.6,7,74,2.8,90.8,52.8,4,3,2,5,7])=> 74second_largest([1,1,1,1,1,2])=> 1second_largest([2,2,2,2,2,1])=> 2second_largest([10,7,10])=> 10second_largest([1,1,1,1,1,1])=> 1second_largest([1])=> Nonesecond_largest([])=> None
更新资料
我对条件进行了重组,以大大提高性能。在我对随机数的测试中几乎达到了100%。原因是在原始版本中,
elif总是在下一个数字不是列表中最大的可能情况下对进行评估。换句话说,对于列表中的几乎每个数字,都进行了两次比较,而一次比较就足够了–如果该数字不大于第二大数字,那么它也不大于第二大数字。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)