查找列表中两个最小值

我试图将数字列表的两个最小值作为元组返回。然而,下一个代码继续返回列表的前两个值。


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

有没有办法通过迭代来做到这一点?


POPMUISE
浏览 62回答 1
1回答

森栏

变量min1和不会更新,它们不是对列表的第一个和第二个元素的引用,它们是对发生赋值时min2索引 0 和 1 处的值的引用。你以后改变并不重要。list[0]list[1]在Python中,列表索引和变量都只是对实际对象的引用。将 Python 对象想象成气球,变量和索引只是绑定到气球上的字符串的标签。您可以将多个标签附加到气球上,但如果您将标签移动到不同的气球上,则绑定到旧气球上的其他标签将不会跟随。在这里,min1和min2被绑在气球上,气球上已经绑有0和索引标签。1后来,当您分配给 时list[i],您将特定的索引标签重新绑定到另一个气球,但min1和min2标签没有改变。附带说明一下,这部分代码有一个相当明显的错误:if list[0] < list[1]:&nbsp; &nbsp; list[i] = list[1]else:&nbsp; &nbsp; list[i] = list[1]&nbsp;两个分支都做完全相同的事情,分配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 min2min1, min2 = list[:2]if min2 < min1:&nbsp; &nbsp; min1, min2 = min2, min1for i in range(1, length):&nbsp; &nbsp; if list[i] < min1:&nbsp; &nbsp; &nbsp; &nbsp; min1 = list[i]&nbsp; &nbsp; elif list[i] < min2:&nbsp; # but equal to or greater than min1!&nbsp; &nbsp; &nbsp; &nbsp; min2 = list[i]我还确保min1 < min2在一开始,这使循环变得更加简单,因为如果list[i] < min1不成立,那么它可能会小于min2但您不需要min1第二次测试。请注意,我们在这里将list[i]值分配给min1和min2,您希望用刚刚测试的值更新这两个变量list[i],前提是确实小于之前的值。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python