我试图将数字列表的两个最小值作为元组返回。然而,下一个代码不断返回列表的前两个值。
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
有没有办法通过迭代来做到这一点?
变量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),然后您测试是否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]
,让你的循环更新min1
和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]
是确实比您之前的值小。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句