它工作正常,但在尝试使用时
my_nums = [16,5,7,9,12]
不起作用。
def get_second_largest(nums):
largest = nums[0]
second_largest = nums[0]
for i in range(1,len(nums)):
if nums[i] > largest:
second_largest = largest
largest = nums[i]
elif nums[i] > second_largest:
second_largest = nums[i]
return second_largest
my_nums = [16,5,7,9,12]
second_largest = get_second_largest(my_nums)
print("Second highest number is : ",second_largest)
my_nums = [16, 5, 7, 9, 12]
my_nums.remove(max(set(my_nums))) #removing the maximum element
print(max(my_nums)) #printing the second largest element
还有一种方法
对列表进行排序(默认升序(,并返回排序输出的倒数第二个元素。
def get_second_largest(nums):
return None if len(nums) < 2 else sorted(nums)[-2]
使用sort
:有一种更简单的方法
my_nums = [16, 5, 7, 9, 12]
my_nums.sort(reverse=True) # Descending order
print(my_nums[1]) # Output: 12
如果你想在不排序的情况下处理,正如上面有人评论的那样,你需要在列表范围之外设置变量的初始值。-1
在您的示例中就足够了,但更好的方法是设置起始值,这样就不会有更小的值:float('-inf')
。
您唯一的错误是将largest
和second_largest
都设置为nums[0]
,在本例中,这恰好是可用的最大数字,因此它永远不会被替换。
顺便说一句,为什么不直接在列表项上迭代而不是索引呢?
所以你的代码可能会变成这样:
def second_largest(nums):
largest = second_largest = 0 #or -math.inf if you want to account for any possible value
for n in nums:
if n > largest:
second_largest = largest
largest = n
elif n > second_largest:
second_largest = n
return second_largest
最后,这可以被推广到找到第k个最大的数字(尽管在这一点上排序可能是更好的策略(:
def kth_largest(nums, k):
largest_nums = [0 for x in range(k)]
for n in nums:
for i,large in enumerate(largest_nums):
if n > large:
largest_nums.insert(i,n)
del largest_nums[-1]
break
return largest_nums[k-1]
您可以使用np.sort((对数组进行排序并访问倒数第二个元素。
它看起来像这样:
my_nums_sorted = np.sort(np.array(my_nums)) # Convert to np.array and sort
second_largest = my_nums_sorted[-2]