代码之家  ›  专栏  ›  技术社区  ›  JoYSword

列表中的python交换项[关闭]

  •  -1
  • JoYSword  · 技术社区  · 8 年前

    我手头有一个任务,我需要整理一个 n -通过重复交换两个项,其项为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]] (即。 ),正在获取 [2,1,0,4,3] ,然后交换 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]] )工作。

    任何人都能解释背景中发生了什么以及为什么第一个案例不起作用?谢谢。

    1 回复  |  直到 8 年前
        1
  •  2
  •   blhsing    8 年前

    这是因为元组中的项是从左到右计算的。

    arr[i], arr[arr[i]] = arr[arr[i]], arr[i] 然后 arr[i] 首先赋给一个新值,以便索引 在里面 arr[arr[i]] 将不再与语句开头的值相同。如果是相反的顺序,这个问题就不存在了,因为 首先分配一个新值。