2 回答
![?](http://img1.sycdn.imooc.com/54584dd900014f6c02200220-100-100.jpg)
TA贡献1820条经验 获得超2个赞
首先将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]
如果您正在学习算法,那么冗长的方法可能会更好。但是,如果您的目标是学习Python,那么这个较短的版本更好,因为通常最好只使用该语言的各个方面,使您的生活变得更加轻松。
而且,顺便说一句,您可能需要考虑列表上下文中第二大的含义[3, 3, 2, 1](例如)。
您当前的代码(因此也是我的代码)指出这3是第二大的,但这可能不一定是最好的定义 - 它可以被认为是2(第二大值(没有重复)而不是第二大项) 。并不是说任何一种方法都是正确的方法,只是说您可能需要考虑它。
如果这是您要使用的第二大的定义,则只需使用预先删除重复项的集合即可进行轻微修改:
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]
![?](http://img1.sycdn.imooc.com/545847f50001126402200220-100-100.jpg)
TA贡献1812条经验 获得超5个赞
当最大的数字位于第一位时,您的代码将不执行任何操作。只需将 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
添加回答
举报