2

我正在尝试交换列表中的 2 个元素。我想将索引 0 处的元素交换为索引 arr[0] 处的元素,所以基本上我想交换 arr[0] <-> arr[arr[0]]。

我一直使用这种方法在索引 i 和 j 之间交换元素:

arr[i], arr[j] = arr[j], arr[i]

但在这种情况下它似乎不起作用。如果我做:

arr = [1, 2, 3, 4, 5]
arr[0], arr[arr[0]] = arr[arr[0]], arr[0]
print(arr)
[2, 2, 1, 4, 5]

但我希望:

arr = [1, 2, 3, 4, 5]
tmp = arr[arr[0]]
arr[arr[0]] = arr[0]
arr[0] = tmp
print(arr)
[2, 1, 3, 4, 5]

有人可以解释这种行为吗?

4

4 回答 4

2

你应该先改变arr[arr[0]]value 然后arr[0]value 。所以换个地方就能解决问题。

arr = [1, 2, 3, 4, 5]
arr[arr[0]] , arr[0] = arr[0] , arr[arr[0]]
print(arr)

[2, 1, 3, 4, 5]
于 2021-01-17T03:48:08.670 回答
0

Python 根据位置交换值。当您看到 的操作码时a, b = b, a,您会看到我将调用一个名为 的方法ROT_TWO()。您可以在此处找到相关参考,并在此处找到cpython 实现。

让我们使用前两个索引 0 和 1。

首先它将 0 压入堆栈,然后将 1 压入堆栈。现在它弹出位置(索引)为 1 的位置,我们在数组中有值 2。它交换。

现在它弹出位置(索引)0。现在我们在位置 0 处有值 2。这就是为什么我们在索引 0 和 1 处有值 2。

希望这能回答我们的问题。

于 2021-01-17T08:50:49.330 回答
0

你概率。可以试试这个看看它对你有帮助:

arr = [1, 2, 3, 4, 5]

for i in range(0,len(arr)-1, 2):
    arr[i], arr[i+1] = arr[i+1], arr[i]

print(arr)

输出:

[2, 1, 4, 3, 5]
于 2021-01-17T03:41:31.630 回答
0
arr = [1, 2, 3, 4, 5]
#the prob with your code is you are first assigning the vaue and changing it
arr[arr[0]],arr[0] =arr[0],arr[arr[0]]
print(arr)
[2, 1, 3, 4, 5]

只需颠倒顺序就可以了,现在可以正常工作了

于 2021-01-17T05:00:49.877 回答