2010-11-25 4 views
11

私は2次元の点のリストを持っており、与えられた点に最も近い点を探したいと思います。以下のコード(get_closest_point())は、私が望むことをします。しかし、Pythonでこれを行うには、より良い方法がありますか?別のポイントに最も近いリスト内のポイントを見つけるために、より平凡な方法がありますか?

class Circle(object): 
    def __init__(self, pos): 
     self.position = pos 


class Point(object): 
    .. 
    def compute_distance_to(self, p) 
     .. 

class SomeClient(object): 
    .. 

    def get_closest_point(self, points, p1): 
     closest = (None, float(sys.maxint)) 
     for p2 in points: 
      distance = p2.compute_distance_to(p1) 
      if distance < closest[1]: 
       closest = (p2, distance) 

     return closest[0] 

    def get_closest_circle(self, circles, p1): 
     closest = (None, float(sys.maxint)) 
     for c in circles: 
      distance = c.position.compute_distance_to(p1) 
      if distance < closest[1]: 
       closest = (c, distance) 

     return closest[0] 
+0

興味深い質問です。 argmax/argminの変種を何度も何度も繰り返し実装しています – Nicolas78

答えて

19

あなたはmin()関数にkey引数を使用することができます。

編集:いくつか検討した後、これはあなたのPointクラスのメソッドであるべきであり、私は他のいくつかの明白な欠陥を修正します:

class Point(object): 
    def get_closest_point(self, points): 
     return min(points, key=self.compute_distance_to) 

または、より複雑なケースでこれを行うには、と言うloc属性を持つインスタンスのリスト、

min(items, key= lambda item: p1.compute_distance_to(item.loc)) 

など

+0

良い答え!もっと興味深いのは、オブジェクトのリストがポイントではなく、ポイントメンバーを持つオブジェクトのリストの場合はどうでしょうか?例えば。 – Kristian

+0

@aaronasterlingクローズだけど葉巻はありません:比較は距離ではなくオブジェクトを返さなければなりません...ありがとう、とにかく! :) – Kristian

+1

'key'はPython 2.5で新しく追加されました。 –

関連する問題