【发布时间】:2018-09-02 16:06:14
【问题描述】:
我手头有一个任务,我需要通过重复交换两个项目来对一个 n-length 列表进行排序,该列表的项目为 0~n-1 而没有重复项。
我想一直将arr[0] 与索引为arr[0] 的项目(即arr[arr[0]])交换直到arr[0] = 0,然后重复对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]与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] 时,它不起作用(它只会生成arr[i] = arr[arr[i]])。
以相反的顺序交换(即arr[arr[i]], arr[i] = arr[i], arr[arr[i]])有效。
任何人都可以解释后台发生的事情以及为什么第一个案例不起作用?谢谢。
【问题讨论】:
-
为什么不使用
arr[i], arr[-i] = arr[-i], arr[i]?这将确保您同时从正面和背面访问列表 -
当您说“它不起作用”时,我们不明白您的意思。您收到错误消息吗?它有什么作用吗?它会做一些超出你预期的事情吗?最好发布一个说明您的确切问题的实际代码示例。
-
max(arr) >= len(arr)时会发生什么? -
@Cut7er 这不是我想要做的。请参阅编辑后的描述。谢谢。