在for循环中交换元素在交换后返回相同的索引

时间:2016-01-17 19:04:45

标签: python for-loop swap

有人可以解释下面的循环:

for item in aList[start:end:1]:
  aList[aList.index(item)],aList[aList.index(item)+1] = aList[aList.index(item)],aList[aList.index(item)+1]

我们说aList = [5,2,3,6,1]。第一次迭代,索引将为0.在第二次迭代将再次为0,之后将增加到2.因此,它将选择[5,2]并将继续[2,5] [3,6] ....

为什么这样做以及正确的方法是什么?

更新:以上只是我想了解的特定行为的一个示例。实际的代码试图实现一个coctail排序算法。 实际代码就是那样

if f == 1:
        for d in area[start:end:f]:
            print area,f ,d,area[area.index(d)+1],area.index(d)+1

            if d > area[area.index(d)+1]:
                tmp = area.index(d)
                area[tmp], area[tmp+1] = area[tmp+1],area[tmp]
                area=area
        end -= 1
        f = ~f + 1
    if f == -1:

        for d in area[end:start:f]:
            print area,f,d,area[area.index(d)-1],area.index(d)-1
            if d < area[area.index(d)-1]:
                tmp = area.index(d)
                area[tmp], area[tmp-1] = area[tmp-1], area[tmp]
                area=area

        start += 1
        f = ~f + 1

2 个答案:

答案 0 :(得分:0)

正如John所说,在循环遍历列表时改变列表是一个坏主意。而是创建列表的副本并更改列表副本中的数据。但是,如果您指定可能有更好的方法,那么它也不清楚您要实现的目标。

答案 1 :(得分:0)

在深入研究问题之前,值得注意的是,编写的代码存在一些问题。

  • startend未定义
  • for-loop中的赋值实际上没有交换订单

除了这些之外,算法失败了,因为你遍历每个项目。我将经历2次迭代,向您展示为什么会如此。

让我们用你的例子: aList = [5,2,3,6,1]

第一次迭代:

item = 5 aList.index(5) = 0 所以,我们要交换aList[0]aList[1] 在迭代结束时,aList = [2,5,3,6,1]

第二次迭代:

item = 2 等等,为什么2?因为切片操作会创建一个我们正在迭代的新列表,并且该列表具有原始顺序。

aList.index(2) = 0 所以,我们要再次交换aList[0]aList[1]。 在迭代结束时,aList = [5,2,3,6,1] ...这是原始订单。

等等

在第三次迭代中,我们将最终交换第3和第4项。在循环的第四次迭代中,我们将再次交换它们。

您可以通过向for循环添加print语句来验证这种情况:print aList

那你怎么解决它?

您可以通过迭代所有其他项而不是每个项来绕过此行为。尝试将切片步幅(步骤)更改为2,而不是1。