不带.sorted的第二大整数

时间:2018-11-11 00:50:38

标签: python python-3.x

def second_largest(numbers):
    first = 0
    second = 0
    for n in numbers:
        if n > first:
            first, second = n, first
        elif first > n > second:
            second = n
    return second or None
print(second_largest([2,2,2,-2]))

当我运行这段代码时,输​​出为None,但我需要它为-2,而且我不能将.sorted函数和其他函数用于数组。我认为问题出在second = 0中,但我不知道如何解决。

4 个答案:

答案 0 :(得分:3)

这是我看到的几个问题。

  1. 您错误地实例化了firstsecond(如果最大数为负,该怎么办?)?
  2. 您唯一要返回None的情况是列表大小小于2。
  3. 将您的退货条件更改为return second

def second_largest(numbers):
    if len(numbers) < 2:
        return None

    first, second = numbers[0], numbers[1]
    if first < second:
        first, second = second, first

    for n in numbers[2:]:
        if n > first:
            first, second = n, first
        elif n > second:
            second = n

    return second

答案 1 :(得分:0)

不确定这是否是您要查找的内容,但是您基本上可以从列表中删除最大的元素(或记下该元素),然后在剩下的位置中搜索第二大的元素。在这里,我首先使用max()(适用于任何可迭代对象的python内置函数)来获取列表中最大的元素,然后使用列表推导创建第二个元素列表,以实现此目的不要等于最大元素,最后再次使用max()从原始列表中获取第二大元素。

def second_largest(numbers):
    first = max(numbers)
    second = max([i for i in numbers if i != first])
    return second

如果出于某种原因不想使用for,则可以为此使用max()循环。

答案 2 :(得分:0)

您提供的代码不适用于n == first的情况。将elif first > n > second更改为elif n > second就足够了(您无需测试first >= n是否为零,因为控制权是否可以到达该行n > first必须为假)。

答案 3 :(得分:0)

不使用sorted吗?

values = [2,2,2,-2]
values.sort(reverse=True)   # technically correct
second_largest = values[1]

或更有趣的

values = set([2,2,2,-2])
values.remove(max(values))
second_largest = max(values)

甚至

import heapq
heapq.nlargest(2, [2,2,2,-2])