2017-02-26 6 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ループを追加して5回ループした後、正常に削除されました。

アイデア? 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) 

または1行で:

self.trails = [ 
    x for x in self.trails if 
    distance_real(pointx, pointy, trail[0], trail[1]) >= 5] 
関連する問題