亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

查找列表中兩個最小值

查找列表中兩個最小值

POPMUISE 2023-10-25 10:43:50
我試圖將數字列表的兩個最小值作為元組返回。然而,下一個代碼繼續返回列表的前兩個值。def test():   list = [4, 5, 1, 9, -2, 0, 3, -5]   min1 = list[0]  min2 = list[1]  length = len(list)    for i in range(1, length):    if list[i] < list[0]:        if list[0] < list[1]:            list[i] = list[1]        else:            list[i] = list[1]     else:        if list[i] < list[1]:            list[i] = list[1]    print(min1, min2)    return (min1, min2) test()控制臺輸出:4,5有沒有辦法通過迭代來做到這一點?
查看完整描述

1 回答

?
森欄

TA貢獻1810條經驗 獲得超5個贊

變量min1和不會更新,它們不是對列表的第一個和第二個元素的引用,它們是對發生賦值時min2索引 0 和 1 處的值的引用。你以后改變并不重要。list[0]list[1]


在Python中,列表索引和變量都只是對實際對象的引用。將 Python 對象想象成氣球,變量和索引只是綁定到氣球上的字符串的標簽。您可以將多個標簽附加到氣球上,但如果您將標簽移動到不同的氣球上,則綁定到舊氣球上的其他標簽將不會跟隨。


在這里,min1和min2被綁在氣球上,氣球上已經綁有0和索引標簽。1后來,當您分配給 時list[i],您將特定的索引標簽重新綁定到另一個氣球,但min1和min2標簽沒有改變。


附帶說明一下,這部分代碼有一個相當明顯的錯誤:


if list[0] < list[1]:

    list[i] = list[1]

else:

    list[i] = list[1] 

兩個分支都做完全相同的事情,分配list[1]給list[i].


否則,即使您希望在循環內更改 和 會更改 和 的值,您也會執行完全錯誤的分配,您正在更改列表中的另一個list[0]值list[1],即min1應該min2較小list[i]的值。


因此,對于i = 2,list[i]islist[2]和list[2] < list[0]is true (1 < 4),然后測試 if list[0] < list[1](也是 true,4 < 5),因此您可以list[i] = list[1]設置list[2] = 5,將設置保留list[0]為4,list[1]設置為5,并實際上丟棄1出現在的值list[2]前。


不要與list[0]or進行比較list[1],而是讓循環更新min1and min2:


# min1 is always smaller than min2

min1, min2 = list[:2]

if min2 < min1:

    min1, min2 = min2, min1


for i in range(1, length):

    if list[i] < min1:

        min1 = list[i]

    elif list[i] < min2:  # but equal to or greater than min1!

        min2 = list[i]

我還確保min1 < min2在一開始,這使循環變得更加簡單,因為如果list[i] < min1不成立,那么它可能會小于min2但您不需要min1第二次測試。


請注意,我們在這里將list[i]值分配給min1和min2,您希望用剛剛測試的值更新這兩個變量list[i],前提是確實小于之前的值。


查看完整回答
反對 回復 2023-10-25
  • 1 回答
  • 0 關注
  • 126 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號