我手头有一项任务,我需要通过重复交换两个项目来排序一个n
长度为0〜n-1且没有重复项的列表。
我想继续将arr[0]
与索引为arr[0]
(即arr[arr[0]]
)的项交换,直到arr[0] = 0
,然后重复对{{1} }到arr[1]
。
例如,如果列表为arr[n-1]
,我首先将arr=[1,2,0,4,3]
与arr[0]
(即arr[arr[0]]
)交换,得到arr[1]
,然后交换再次[2,1,0,4,3]
与arr[0]
,(这次arr[arr[0]]
),得到arr[2]
,然后与[0,1,2,4,3]
交换arr[3]
,得到最终结果{{ 1}}。
代码如下:
arr[4]
问题是,当我执行[0,1,2,3,4]
时,它不起作用(它只能使while i < len(arr) - 1:
while arr[i] != i:
arr[i], arr[arr[i]] = arr[arr[i]], arr[i] # not working
arr[arr[i]], arr[i] = arr[i], arr[arr[i]] # working
i += 1
)。
以相反的顺序(即arr[i], arr[arr[i]] = arr[arr[i]], arr[i]
)交换。
任何人都可以解释背景情况,为什么第一种情况不起作用?谢谢。
答案 0 :(得分:1)
这是因为元组中的项目是从左到右进行评估的。
如果您执行arr[i], arr[arr[i]] = arr[arr[i]], arr[i]
,则arr[i]
将首先被分配一个新值,这样arr[i]
中的索引arr[arr[i]]
将不再是原来的值。在声明的开头。如果顺序相反,则此问题将不存在,因为arr[arr[i]]
首先被分配了一个新值。