Python:对于循环行为很奇怪

时间:2012-07-16 18:50:18

标签: python for-loop

我正试图解决这个问题:CodeEval

问题要求我查看XY坐标中可能的点候选列表。然后,如果它们满足要求,我将它们添加到“已确认”列表中,然后将周围的点添加到“tosearch”列表中。然而,这并不像我期望的那样表现。

示例代码:

Starting point
tosearch=[[0,0]] 

for point in tosearch:

    if conditions filled:
        confirmed.append(point)
        #Basically Im trying to add (x,y-1) etc. to the tosearct list
        tosearch.append([point[0],point[1]-1])  #1 
        tosearch.append([point[0]+1,point[1]])  #2
        tosearch.append([point[0]-1,point[1]-1])#3
        tosearch.append([point[0],point[1]+1])  #4
        tosearch.remove(point)
else:
     tosearch.remove(point)

这似乎导致总是忽略了一半的追加。因此,在这种情况下,#1和#3被忽略。如果我只留下1和2,那么只会执行2。我不明白......

也许问题出在其他地方所以这里是整个代码: Pastebin

2 个答案:

答案 0 :(得分:5)

你在迭代它时修改了这个集合 2个选项:

  1. 复制列表,重复复制并更改原件。
  2. 跟踪需要进行的更改,并在迭代后完成所有更改。

答案 1 :(得分:0)

问题是你正在修改迭代tosearch的循环体中的tosearch。由于tosearch正在发生变化,因此无法可靠地迭代。

您可能根本不需要迭代。只需使用while循环:

searched = set() # if you need to keep track of searched items
tosearch = [(0,0)] #use tuples so you can put them in a set
confirmed = []

while tosearch:
    point = tosearch.pop()
    searched.add(point) # if you need to keep track
    if CONDITIONS_MET:
        confirmed.append(point)
        # tosearch.append() ....