2 回答

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超2個(gè)贊
首先將largest和設(shè)置second_largest為最大元素值(在本例中為第一個(gè)):
largest = nums[0]
second_largest = nums[0]
不幸的是,這意味著表達(dá)式:
nums[i] > largest
nums[i] > second_largest
永遠(yuǎn)不會(huì)成立,因此second_largest永遠(yuǎn)不會(huì)改變其初始(最大)值。
如果您仍然想使用當(dāng)前的方法,這會(huì)更好:
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])}")
除了初始化方式(從前兩個(gè)元素而不僅僅是第一個(gè)元素)之外,該函數(shù)中的大部分代碼都是相同的。
當(dāng)然,更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]
如果您正在學(xué)習(xí)算法,那么冗長(zhǎng)的方法可能會(huì)更好。但是,如果您的目標(biāo)是學(xué)習(xí)Python,那么這個(gè)較短的版本更好,因?yàn)橥ǔW詈弥皇褂迷撜Z(yǔ)言的各個(gè)方面,使您的生活變得更加輕松。
而且,順便說(shuō)一句,您可能需要考慮列表上下文中第二大的含義[3, 3, 2, 1](例如)。
您當(dāng)前的代碼(因此也是我的代碼)指出這3是第二大的,但這可能不一定是最好的定義 - 它可以被認(rèn)為是2(第二大值(沒(méi)有重復(fù))而不是第二大項(xiàng)) 。并不是說(shuō)任何一種方法都是正確的方法,只是說(shuō)您可能需要考慮它。
如果這是您要使用的第二大的定義,則只需使用預(yù)先刪除重復(fù)項(xiàng)的集合即可進(jìn)行輕微修改:
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]

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊
當(dāng)最大的數(shù)字位于第一位時(shí),您的代碼將不執(zhí)行任何操作。只需將 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
添加回答
舉報(bào)