在Python中迭代交换元素

2024-09-29 17:17:23 发布

您现在位置:Python中文网/ 问答频道 /正文

对于这个简单的代码片段,我很难理解幕后发生了什么:

def changeArray(arr):
     for i in range(len(arr)):
         arr[i], arr[arr[i] - 1] = arr[arr[i] - 1], arr[i]
         print(arr)
     return(arr)

该代码假定数组的元素是从1到n的整数。 当输入为[1,3,4,2]时,给定代码的输出为:

[1, 3, 4, 2]
[1, 4, 4, 3]
[1, 4, 4, 3]
[1, 4, 4, 3]
Out[8]: [1, 4, 4, 3]

当我期望它打印并返回这个时:

[1, 3, 4, 2]
[1, 4, 3, 2]
[1, 4, 3, 2]
[1, 2, 3, 4]
Out[8]: [1, 2, 3, 4]

当代码只交换元素时,为什么值会发生变化?你知道吗


编辑:

原来,更改交换顺序可以解决问题:

def changeArray(arr):
     for i in range(len(arr)):
         arr[arr[i]-1], arr[i] = arr[i], arr[arr[i]-1]
         print(arr)
     return(arr)

这将产生以下输出:

[1, 3, 4, 2]
[1, 4, 3, 2]
[1, 4, 3, 2]
[1, 2, 3, 4]
Out[8]: [1, 2, 3, 4]

改变顺序是如何按预期进行交换的,而相反的顺序则完全是另一回事?你知道吗


Tags: 代码in元素forlenreturn顺序def
2条回答

将表达式更改为

 arr[arr[i] - 1], arr[i] = arr[i], arr[arr[i] - 1]

为我工作。仍然不知道这些值是如何或为什么变化的。我也是python的新手对不起。你知道吗

一般来说,您不应该使用您正在变异的对象来指定要替换的目标位置,否则会非常混乱。你知道吗

当你写这个的时候:

 arr[i], arr[arr[i] - 1] = arr[arr[i] - 1], arr[i]

大致相当于:

tup = arr[arr[i] - 1], arr[i]
x, y = tup
arr.__setitem__(i, x)
arr.__setitem__(arr[i] - 1, y)

(关于如何翻译这篇文章的全部细节是in the reference docs,但希望原创性的想法简单得多。)

这应该让你明白为什么你会得到你想要的结果。以及为什么下面这些都是你想要的:

x = arr[i] - 1
arr[i], arr[x] = arr[x], arr[i]

arr[arr[i] - 1], arr[i] = arr[i], arr[arr[i] - 1]

def swap(x, y):
    arr[x], arr[y] = arr[y], arr[x]
swap(i, arr[i] - 1)

我认为第一个是最简单的(第二个看起来很简单,但只会误导人)。你知道吗

相关问题 更多 >

    热门问题