Python'in'运算符在数组中不起作用

时间:2014-03-26 01:11:50

标签: python

我是python的初学者,并制作2D随机漫步程序。(向上和向下,向左和向右)。我希望步行者不要去他们去过的地方。

所以,我制作了一些数组,一个是收集坐标历史的数组。 我还定义了一个函数,它返回特定位置的可能选项。似乎功能没有

def opt(histo,cur):
  tmp=[]
  tmp.append([cur[0]+1,cur[1]])
  tmp.append([cur[0]-1,cur[1]])
  tmp.append([cur[0],cur[1]+1])
  tmp.append([cur[0],cur[1]-1])
  tmp.remove(histo[-2])
  print "current history : ",histo
  print "current tmp : ",tmp
  print "current pos : ",cur
  for i in tmp:
    if i in histo:
      print str(i)+" was detected!!"
      tmp.remove(i)
  return tmp

代码导致

...

当前历史:[[0,0],[0,-1],[0,-2],[ - 1,-2],[ - 1,-1],[ - 2,-1] ,[-2,0],[ - 3],[ - 3,-1],[ - 3, - 2],[ - 3,-3],[ - 3,-3],[ - - ] ,-3],[ - 6,-3],[ - 7,-3],[ - 7,-2],[ - 6, - 2],[ - 5, - 2],[ - , - , - 1],[ - 4,-1],[ - 4, - 2]]

当前tmp:[[ - 3,-2],[ - 5, - 2],[ - 4,-3]]

当前pos:[ - 4,-2]

检测到[p> [ - 3,-2] !!

检测到[p> [ - 4,-3] !!

消除后:[[ - 5,-2]]

...

为什么[-5,-2]在这种情况下是安全的?

1 个答案:

答案 0 :(得分:0)

可能的最小变化如下:

def opt(histo,cur):
  tmp=[]
  tmp.append([cur[0]+1,cur[1]])
  tmp.append([cur[0]-1,cur[1]])
  tmp.append([cur[0],cur[1]+1])
  tmp.append([cur[0],cur[1]-1])
  tmp.remove(histo[-2])
  print "current history : ",histo
  print "current tmp : ",tmp
  print "current pos : ",cur
  for i in list(tmp):
    if i in histo:
      print str(i)+" was detected!!"
      tmp.remove(i)
  return tmp

也就是说,它会将tmp更改为list(tmp)。这样,您就不会迭代您正在修改的列表的同一副本。

也就是说,in在列表上使用时效率很低,出于性能和正确性原因,元组应该用于内部数据结构。因此,您还应将所有引用的[cur[0]+1, cur[1]]更改为(cur[0]+1, cur[1]),并将histo的类型修改为一组。