【问题标题】:why the swapping does not take place when indices are 0 and 1?为什么当索引为 0 和 1 时不会发生交换?
【发布时间】:2019-09-15 11:18:22
【问题描述】:

我有一个由连续整数[1, 2, 3, ..., n] 组成的无序数组,没有任何重复。允许交换任意两个元素。我需要找到按升序对数组进行排序所需的最小交换次数。

从列表的第一个元素开始,我尝试将它们放在正确的位置(例如,如果第一个元素是 7,它应该在列表的第 6 位)。为了在列表中逐一进行,我制作了一个副本,然后在第二个列表中进行交换。

a = [4,3,1,2]
b = a[:]
swap = 0
for p in a:
  if (p!= b[p-1]):
    b[p-1], b[b.index(p)] =  b[b.index(p)], b[p-1]
    swap+=1
print(swap)

此代码有效,但在这种情况下,我必须交换列表中位置为 0 或 1 的两个元素。我不明白为什么?因为我没有超出限制。

谁能解释一下为什么会这样?

例如,如果我打印 p,两个发生交换的索引,更新的 b 列表和更新的交换次数:

p = 4
idx1= 3 idx2= 0
b= [2, 3, 1, 4]
swap = 1
p = 3
idx1= 2 idx2= 1
b= [2, 1, 3, 4]
swap = 2
p = 1
idx1= 0 idx2= 1
b= [2, 1, 3, 4]
swap = 3
p = 2
idx1= 1 idx2= 0
b= [1, 2, 3, 4]
swap = 4

在这种情况下,您可以看到对于 p = 1,当索引为 0 和 1 时,不会发生交换。

我把b[p-1],b[b.index(p)]的顺序改了,就没有同样的问题了,但是不明白是什么原因。

【问题讨论】:

  • 你能具体说明你遇到了什么错误吗?
  • 你有一个由连续个整数组成的无序数组?这不会使数组有序吗?
  • 当你看到错误时,你能举个例子吗?
  • 这很难理解。首先,您没有向我们展示生成您发布的输出跟踪的代码:发布的代码最后只有一个print。我们不知道这些值是什么时候产生的。其次,您说您已经更改了代码并且它现在可以工作了。我尝试将prints 插入 I 将它们放置的位置,但我没有得到你给定的输出。
  • 最近有很多这样的问题。简短的回答是,停止尝试像这样复杂的交换。首先计算b.index(p)然后进行a, b = b, a风格的交换。

标签: python list indexing swap


【解决方案1】:

我之前也遇到过同样的问题,卡了一段时间。造成这种情况的原因是多次赋值的顺序。

b[p-1], b[b.index(p)] =  b[b.index(p)], b[p-1]

其实多重赋值并不是同时赋值。这背后的打包和解包机制。因此它将首先更改b[p-1],并且b[b.index(p)] 中的b.index(p) 将在p=1 idx1=0 idx2=1 的情况下找到一个新索引p-1

如果您更改分配顺序,它会正常工作。

b[b.index(p)], b[p - 1] = b[p - 1], b[b.index(p)]

或者先计算idx:

idx1, idx2 = p - 1, b.index(p)
b[idx1], b[idx2] = b[idx2], b[idx1]

我推荐第二个版本,因为第一个版本会执行两次index。成本是第二个版本的两倍。

你可以在这里参考我的相关问题:The mechanism behind mutiple assignment in Python


顺便说一句,我认为您的算法在这里效率低下,以减少交换时间,但使用 O(n) index 操作,并在此处复制一个数组。我认为您可以使用相同的想法,只需交换原始数组即可。

【讨论】:

    猜你喜欢
    • 2014-06-02
    • 1970-01-01
    • 2010-10-07
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 2019-09-05
    • 1970-01-01
    相关资源
    最近更新 更多