You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何交换列表最值的Python代码部分测试用例失效?

问题:我的代码为何在特定测试用例下失效?

我的代码

lst = [int(i) for i in input().split()]
a = max(lst)
b = min(lst)
lst[lst.index(a)], lst[lst.index(b)] = lst[lst.index(b)], lst[lst.index(a)]
print(' '.join([str(i) for i in lst]))

正确代码

a = [int(s) for s in input().split()]
index_of_min = 0
index_of_max = 0
for i in range(1, len(a)):
    if a[i] > a[index_of_max]:
        index_of_max = i
    if a[i] < a[index_of_min]:
        index_of_min = i
a[index_of_min], a[index_of_max] = a[index_of_max], a[index_of_min]
print(' '.join([str(i) for i in a]))

测试用例

  • 有效测试用例:'1 2 3 4 5 6 7 8 9 10'
  • 失效测试用例:'10 9 8 7 6 5 4 3 2 1'

问题原因

你的代码核心问题出在交换操作中重复调用lst.index()的逻辑顺序。

拿失效测试用例举例:初始列表是[10,9,8,7,6,5,4,3,2,1],最大值a=10(索引0),最小值b=1(索引9)。

Python执行交换语句时,会先计算等号右侧的两个值:lst[lst.index(b)]是lst[9]即1,lst[lst.index(a)]是lst[0]即10。

但赋值是分步进行的:

  1. 先给lst[lst.index(a)]赋值,也就是把索引0的位置设为1,此时列表变成[1,9,8,7,6,5,4,3,2,10]。
  2. 接着给lst[lst.index(b)]赋值,此时b=1,lst.index(b)会返回第一个1的位置(索引0),于是索引0的位置又被设为10,列表变回初始状态,等于没做交换。

而正确代码的逻辑是先提前找到并保存最大值、最小值的索引,后续交换直接用保存好的索引操作,不会因为列表元素变化导致索引查找出错。

内容的提问来源于stack exchange,提问作者Chubbs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 04:25:08