im试图解决一个问题,但在调试过程中,我发现数组的值在一次之后不会改变。这短短的5行代码中有我做错的地方吗??谢谢你提前回答。
a = [1, 2, 3, 4, 5]
for i in range(5):
b, c = map(int, input().split())
a[a.index(b)], a[a.index(c)] = a[a.index(c)], a[a.index(b)]
print(a)
示例输入:
5 4
1 2
3 4
1 4
2 2
预期输出:
3 1 4 2 5
我的输出:
1 2 3 5 4
您可以使用:
for i in range(5):
b, c = map(int, input().split())
b_index = a.index(b)
c_index = a.index(c)
a[b_index], a[c_index] = a[c_index], a[b_index]
这里有一段代码来理解行为:
a = [1, 2, 3, 4, 5]
def get_index(i, s):
idx = a.index(i)
print(s, i, idx)
return idx
a[get_index(1, 'left')], a[get_index(2, 'left')] = a[get_index(2, 'right')], a[get_index(1, 'right')]
print(a)
输出:
right 2 1
[1, 2, 3, 4, 5]
right 1 0
[1, 2, 3, 4, 5]
left 1 0
[1, 2, 3, 4, 5]
left 2 0
[2, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
正如你所看到的,get_index(2, 'left')
和get_index(2, 'right')
不一样,这表明a.index(c)
在=
算子的左侧和右侧的值不一样
返回您的代码:
a[a.index(b)], a[a.index(c)] = a[a.index(c)], a[a.index(b)]
首先,它从=
运算符的右侧执行代码,因此您有(c,b(,然后a[a.index(b)]
将取值c
,在这一步中,您的列表a
中有c
中的2个,当计算a.index(c)
时,它将返回从左到右找到的第一个c
,在最后一步中您希望将值b
设置为c
开始时的值,但是现在有2个c
,如果c
<b
您将以所需输出结束,因为方法list.index
将返回实际c
的位置;如果CCD_ 19<c
然后b
将取代b开始时的位置,这将导致您的列表a
没有变化
示例:
case b < c
a = [1, 2, 3, 4, 5] --> swap 2 with 5; b = 2, c = 5
a[a.index(b)], a[a.index(c)] = 5, 2
a[a.index(b)] = 5 --> a = [1, 5, 3, 4, 5]
--> a.index(5) --> --> ↑
↑
a[a.index(c)] = 2 --> a = [1, 2, 3, 4, 5]
case b > c
a = [1, 2, 3, 4, 5] --> swap 2 with 5; b = 5, c = 2
a[a.index(b)], a[a.index(c)] = 2, 5
a[a.index(b)] = 2 --> a = [1, 2, 3, 4, 2]
--> a.index(2) --> --> ↑
↑
a[a.index(c)] = 5 --> a = [1, 5, 3, 4, 2]