为了账号安全,请及时绑定邮箱和手机立即绑定

查找列表中两个最小值

查找列表中两个最小值

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 关注
  • 59 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信