将最大数字放在列表的第一位时未给出正确答案
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))中的最大数字,
而这个范围内最大的数字是列表中第二大的数字。如何以及在哪里编写此代码?
您首先将 largest
和 second_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
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))中的最大数字, 而这个范围内最大的数字是列表中第二大的数字。如何以及在哪里编写此代码?
您首先将 largest
和 second_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