为何交换列表最值的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。
但赋值是分步进行的:
- 先给
lst[lst.index(a)]赋值,也就是把索引0的位置设为1,此时列表变成[1,9,8,7,6,5,4,3,2,10]。 - 接着给
lst[lst.index(b)]赋值,此时b=1,lst.index(b)会返回第一个1的位置(索引0),于是索引0的位置又被设为10,列表变回初始状态,等于没做交换。
而正确代码的逻辑是先提前找到并保存最大值、最小值的索引,后续交换直接用保存好的索引操作,不会因为列表元素变化导致索引查找出错。
内容的提问来源于stack exchange,提问作者Chubbs
相关产品推荐
相关产品推荐

