【问题标题】:Element swapping in list using one line multiple assignment使用一行多重赋值在列表中交换元素
【发布时间】:2021-04-21 17:16:18
【问题描述】:

我正在尝试交换列表中的 2 个元素。我想将索引 0 处的元素交换为索引 arr[0] 处的元素,所以基本上我想交换 arr[0] arr[arr[0]]。

我一直使用这种方法在索引 i 和 j 之间交换元素:

arr[i], arr[j] = arr[j], arr[i]

但在这种情况下它似乎不起作用。如果我这样做:

arr = [1, 2, 3, 4, 5]
arr[0], arr[arr[0]] = arr[arr[0]], arr[0]
print(arr)
[2, 2, 1, 4, 5]

但我希望:

arr = [1, 2, 3, 4, 5]
tmp = arr[arr[0]]
arr[arr[0]] = arr[0]
arr[0] = tmp
print(arr)
[2, 1, 3, 4, 5]

谁能解释这种行为?

【问题讨论】:

  • 赋值右边的元组首先被求值(从左到右),然后从左到右一个接一个地赋值给左边的元组元素。 "arr[0]" 首先获取它的新值,所以只需交换每个元组中的顺序。
  • 现在说得通了。我不知道这就是它的执行方式。我认为两者都被同时分配。当我在两个元素 i 和 j 之间进行定期交换时,我没有注意到差异。

标签: python list swap in-place multiple-assignment


【解决方案1】:

Python 根据位置交换值。当您看到a, b = b, a 的操作码时,您会看到我将调用一个名为ROT_TWO() 的方法。您可以在 here 找到相关参考,在 here 找到 cpython 实现。

让我们使用前两个索引 0 和 1。

首先它将 0 压入堆栈,然后将 1 压入堆栈。现在它弹出位置(索引)为 1 的位置,我们在数组中有值 2。它交换。

现在它弹出 location(index) 0。现在我们在位置 0 处有值 2。这就是为什么我们在索引 0 和 1 处有值 2。

希望这能回答我们的问题。

【讨论】:

    【解决方案2】:
    arr = [1, 2, 3, 4, 5]
    #the prob with your code is you are first assigning the vaue and changing it
    arr[arr[0]],arr[0] =arr[0],arr[arr[0]]
    print(arr)
    [2, 1, 3, 4, 5]
    

    只需颠倒顺序就可以了,现在可以正常工作了

    【讨论】:

      【解决方案3】:

      您应该首先更改 arr[arr[0]] 值,然后更改 arr[0] 值。 所以换个地方就能解决问题。

      arr = [1, 2, 3, 4, 5]
      arr[arr[0]] , arr[0] = arr[0] , arr[arr[0]]
      print(arr)
      
      [2, 1, 3, 4, 5]
      

      【讨论】:

        【解决方案4】:

        你很可能。可以试试这个看看它对你有帮助:

        arr = [1, 2, 3, 4, 5]
        
        for i in range(0,len(arr)-1, 2):
            arr[i], arr[i+1] = arr[i+1], arr[i]
        
        print(arr)
        

        输出:

        [2, 1, 4, 3, 5]
        

        【讨论】:

          猜你喜欢
          • 2015-08-03
          • 2015-10-31
          • 1970-01-01
          • 2012-12-28
          • 2020-12-09
          • 2011-12-09
          • 1970-01-01
          • 2018-08-13
          • 1970-01-01
          相关资源
          最近更新 更多