Python,数组在一次迭代(交换)后不会改变



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]

相关内容

  • 没有找到相关文章

最新更新