将最大数字放在列表的第一位时未给出正确答案

Not giving the right answer when putting the largest number at first position of the list

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 = [8,11,29,25,76,12]
second_largest = get_second_largest(my_nums)
print("Second largest number is,",second_largest)

在这个程序中,我们得到第二大数字作为输出,但问题是当我们将列表中的最大数字放在第一个位置时(my_nums[0]), 它给我们最大的数字作为输出说第二大数字。

例如: 输入:list1 = [44,21,34,18,26], 输出:第二大数是,44

这个bug怎么解决(不知道是不是bug,我是新手)?

注意:我想的是如果我能让计算机理解 在所有这些计算之后,如果最大 == 第二大: 找到范围(1,len(nums))中的最大数字, 而这个范围内最大的数字是列表中第二大的数字。如何以及在哪里编写此代码?

您首先将 largestsecond_largest 设置为最大元素值(在本例中为第一个):

largest = nums[0]
second_largest = nums[0]

不幸的是,这意味着表达式:

nums[i] > largest
nums[i] > second_largest

永远不会为真,因此second_largest永远不会改变其初始(最大)值。

如果您仍想使用当前的方法,这样会更好:

def get_second_largest(nums):
    # Return none if list not big enough.

    if len(nums) < 2: return None

    # Get largest and second largest from first two (possible swap).

    largest = nums[0]
    second_largest = nums[1]
    if largest < second_largest:
        (largest, second_largest) = (second_largest, largest)

    # Process all others.

    for i in range(2, len(nums)):
        if nums[i] > largest:
            (second_largest, largest) = (largest, nums[i])
        elif nums[i] > second_largest:
            second_largest = nums[i]
    return second_largest

print(f"Second largest number is {get_second_largest([8,11,29,25,76,12])}")

该函数中的大部分代码是相同的,除了您初始化的方式(从前两个元素而不是仅从第一个元素开始)。


当然,更 Pythonic 的方式是:

def get_second_largest(nums):
    # None if too small, else second last element of sorted items.

    if len(nums) < 2: return None
    return sorted(nums)[-2]

如果您正在学习 算法, 那么 long-winded 方法可能更好。但是,如果您的目标是学习 Python,,那么这个较短的版本更可取,因为通常最好只使用语言中能让您的生活轻松很多的方面。


并且,顺便说一句,您可能想考虑列表上下文中第二大的含义 [3, 3, 2, 1](例如)。

您当前的代码(因此也是我的)指出 3 是第二大的,但可能 不一定 是最好的定义 - 它 可以被认为是2(第二大(没有重复项)而不是第二大项)。不是说哪一种都是对的,只是你可以考虑一下。

如果那个是你想使用的第二大的定义,稍微修改一下就可以解决这个问题,使用一个删除了重复项的集合before-hand:

def get_second_largest_no_dupes(nums):
    # De-dupe, then None or second last sorted element.

    num_set = set(nums)
    if len(num_set) < 2: return None
    return sorted(num_set)[-2]

当最大数字位于第一位时,您的代码将不执行任何操作。只需将您的 3d 线更改为:

second_largest = 0

完整代码:

def get_second_largest(nums):
    largest = nums[0]
    second_largest = min(nums)
    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 = [100,8,11,29,25,76,12]
second_largest = get_second_largest(my_nums)
print("Second largest number is,",second_largest)

76