【问题标题】:python swap items in list [closed]python交换列表中的项目[关闭]
【发布时间】: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) &gt;= len(arr) 时会发生什么?
  • @Cut7er 这不是我想要做的。请参阅编辑后的描述。谢谢。

标签: python arrays


【解决方案1】:

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

如果您执行arr[i], arr[arr[i]] = arr[arr[i]], arr[i],则首先将arr[i] 分配给一个新值,这样arr[arr[i]] 中的索引arr[i] 将不再是语句开头的值。如果顺序相反,则不存在此问题,因为 arr[arr[i]] 首先被分配了一个新值。

【讨论】:

  • 所以arr[i] = arr[arr[i]]arr[arr[i]] = arr[i] 并不是完全独立的。 Python 首先评估arr[i] = arr[arr[i],这将影响arr[arr[i]] = arr[i],后者被评估为第二。我理解对了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-11
  • 1970-01-01
  • 2021-12-09
相关资源
最近更新 更多