根据 python 中的索引交换数组索引

Swapping array indices based on indices in python

我正在尝试设置循环排序,其中数字的范围是提前知道的

def cyclic_sort(nums):
  # TODO: Write your code here
  i = 0

  while i < len(nums):
    while nums[i] - 1 != i:
        nums[i], nums[nums[i] - 1] = nums[nums[i] - 1], nums[i]
    i += 1

  return nums


print(cyclic_sort([2, 1, 3]))

然而,当我重构为下面的代码运行时,代码只是挂起[=13​​=]

def cyclic_sort(nums):
  # TODO: Write your code here
  i = 0

  while i < len(nums):
    while nums[i] - 1 != i:
        other = nums[i] - 1
        nums[i], nums[nums[i] - 1] = nums[nums[i] - 1], nums[i]
    i += 1

  return nums


print(cyclic_sort([2, 1, 3]))

有人可以帮助我了解发生了什么吗?

nums[i] 首先被重新分配,所以当计算 nums[nums[i] - 1] = ... 时,它采用 nums[i] 的新值,在本例中为 1。
因此,在您的示例中,您得到 nums[0] = 1,然后是 nums[1-1] = 2。

您正在将当前元素的值设置为要与之交换的新值,然后将位于交换元素值位置的元素设置为当前值。

您的代码等同于:

        x, y = nums[nums[i] - 1], nums[i]
        nums[i] = x                 #nums[i] is set to value of element you want to swap
        nums[nums[i] - 1] = y       #nums[(value at swapped element) - 1] = (current elements original value)

你也不需要 while 循环,它没有做任何有用的事情,因为你已经根据值知道数字应该在哪个位置,所以你只需要每个位置检查一次。

交换赋值顺序,因为 nums[i] 不会受到更改 nums[nums[i] - 1] 值的影响。

def cyclic_sort(nums):
  # TODO: Write your code here
  i = 0

  while i < len(nums):
    if nums[i] - 1 != i:
        nums[nums[i] - 1], nums[i] = nums[i], nums[nums[i] - 1]
    i += 1

  return nums


print(cyclic_sort([2, 1, 3]))