2010-11-25 8 views
11

मेरे पास 2 डी पॉइंट्स की एक सूची है, और वह एक वह बिंदु ढूंढना चाहता है जो किसी दिए गए बिंदु के सबसे नज़दीकी है। कोड (get_closest_point()) नीचे जो मैं चाहता हूं वह करता है। लेकिन क्या अजगर में ऐसा करने का एक अच्छा तरीका है?क्या किसी अन्य बिंदु के निकटतम सूची में बिंदु ढूंढने के लिए कोई और पाइथोनिक तरीका है?

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

दिलचस्प प्रश्न पर। – Nicolas78

उत्तर

19

आप key तर्क min() कार्य करने के लिए उपयोग कर सकते हैं:

संपादित करें: कुछ विचार करने के बाद, यह आपके 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

अच्छा जवाब फिर से बार-बार argmax/argmin के कुछ प्रकार को लागू करना जारी रखें! इसे और अधिक रोचक बनाने के लिए: क्या होगा यदि ऑब्जेक्ट्स की सूची अंक नहीं है, बल्कि ऑब्जेक्ट्स की एक सूची है जिसमें पॉइंट सदस्य हैं? जैसे एक केंद्र बिंदु के साथ एक सर्कल .. – Kristian

+0

@Aaronasterling बंद करें लेकिन कोई सिगार नहीं: तुलना वस्तु को वापस करने के लिए है, दूरी नहीं ... धन्यवाद, वैसे भी! :) – Kristian

+1

'key' पायथन 2.5 में नया है। –

संबंधित मुद्दे