2017-02-26 91 views
0

名单我有一个包含这样的其他名单的列表:循环通过列表在Python

self.trails = [ 
    [10, 50], 
    [20, 30], 
    [100,50], 
    [25, 75] 
] 

,我被它试图环和删除任何项目,如果他们太靠近一些其他的坐标:

def distance_real(x1,y1,x2,y2): 
    return Math.sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)) 

class MathClass 
    trails = [ 
     [10, 50], 
     [20, 30], 
     [100,50], 
     [25, 75] 
    ] 

    def run(self): 
     pointx = 10 
     pointy = 15 

     while 1: 
     for trail in self.trails: 
      d = distance_real(pointx, pointy, trail[0], trail[1]) 
       if d < 5: 
        self.trails.remove(trail) 
     time.sleep(1.0/30) 

该代码不会删除应该的所有路径。添加一个for循环并循环五次后,成功删除它们。

任何想法?使用for循环在我的情况下效率不高,因为追踪包含几千个实体,并且代码必须在几毫秒内运行。

+0

这些坐标中没有一个距离小于5的'(10,15)'。 –

+0

@Rawing这些数字仅用于演示。 – Globala

回答

2

首先做一个tmp目录清单上的操作,然后在最后

def distance_real(x1,y1,x2,y2): 
    return Math.sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)) 

class MathClass 
    trails = [ 
     [10, 50], 
     [20, 30], 
     [100,50], 
     [25, 75] 
    ] 

    def run(self): 
     pointx = 10 
     pointy = 15 

     tmp = [] 
     while 1: 
      for trail in self.trails: 
       d = distance_real(pointx, pointy, trail[0], trail[1]) 
       if d >= 5: 
        tmp.append(trail) 
      self.trails = tmp 
      time.sleep(1.0/30) 
分配 trails
1

您在迭代时正在修改列表。首先尝试将其转换为一个元组,像这样:

for trail in tuple(self.trails): 
    d = distance_real(pointx, pointy, trail[0], trail[1]) 
    if d < 5: 
     self.trails.remove(trail) 

或一条线:

self.trails = [ 
    x for x in self.trails if 
    distance_real(pointx, pointy, trail[0], trail[1]) >= 5]