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
中,但我不知道如何解决。
答案 0 :(得分:3)
这是我看到的几个问题。
first
和second
(如果最大数为负,该怎么办?)?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])