2014-03-13 46 views
0

对于许多点,我正在计算位于(x, y)中的参考点的距离。我怎样才能找到距离的最小值?这些是我写的代码行:使用for循环的最小距离

for k in range(0, 10): 
    dist = math.sqrt((x - data.X[k])**2 + (y - data.Y[k])**2) 
+0

你如何存储你正在比较的点? – inspectorG4dget

+0

这些点具有坐标'(X [k],Y [k])'。我从文件中读取它们,然后在写入输出文件之前将它们存储起来。 –

回答

1

你的意思是这样的吗?

min=math.sqrt((x - data.X[0])**2 + (y - data.Y[0])**2) 
for k in range(0, 10): 
    dist = math.sqrt((x - data.X[k])**2 + (y - data.Y[k])**2) 
    if dist<min: 
     min=dist 

或者:

for k in range(0, 10): 
    dist = math.sqrt((x - data.X[k])**2 + (y - data.Y[k])**2) 
    try: 
     if dist<min: 
      min=dist 
    except NameError: 
     min=dist 
+0

正是......感谢您展示如何使用'try'! –

+0

如何获得最小值对应的'k'值? –

+0

@albus_c'data.index(min)'应该做的伎俩。引用[this](http://docs.python.org/2/tutorial/datastructures.html#more-on-lists):_list.index(x):返回第一个项目列表中的索引,其值为X。这是一个错误,如果没有这样的item._另外,关于使用'try',请参见[here](http://docs.python.org/2/glossary.html#term-eafp) – Dunno

1

类是你的朋友。这有点多,但它更好,而且是可扩展的。

class point: 
    def __init__(self, x, y): 
     self.x = x 
     self.y = y 

    def __str__(self): 
     return '{0}, {1}'.format(self.x, self.y) 

    def distanceto(self, other): 
     return math.sqrt((self.x - other.x)**2 + (self.y - other.y)**2) 

    def closestpoint(self, pointlist): 
     pointinfo = [{'point':x, 'dist':self.distanceto(x)} for x in pointlist] 
     pointinfo.sort(key=lambda p: p.dist) 
     return pointinfo[0] 

而不是从文件中读取点和seperately保存XY组件,为什么不将它们保存为点的列表?

# all points read from the file. 
listofpoints = [] 
for i in range(0, 10): 
    listofpoints.append(point(data.X[i], data.Y[i])) 

# the point you'd like to test against. 
mytestpoint = point(0,0) 

您现在可以使用point成员方法测试所有点的差异。

closest = mytestpoint.closestpoint(listofpoints) 
print 'Closest point is at {0} and is a distance of {1} from {2}'.format(
    closest, 
    mytestpoint.distanceto(closest), 
    mytestpoint)