从列表中找出倒数第二个数字



它工作正常,但在尝试使用时

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')

您唯一的错误是将largestsecond_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]

相关内容

  • 没有找到相关文章

最新更新