2017-02-26 171 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]