有人可以解释下面的循环:
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
答案 0 :(得分:0)
正如John所说,在循环遍历列表时改变列表是一个坏主意。而是创建列表的副本并更改列表副本中的数据。但是,如果您指定可能有更好的方法,那么它也不清楚您要实现的目标。
答案 1 :(得分:0)
在深入研究问题之前,值得注意的是,编写的代码存在一些问题。
start
和end
未定义除了这些之外,算法失败了,因为你遍历每个项目。我将经历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。