如何编写分析列表或坐标对的函数,使用距离公式选择对是最接近的,然后只返回距离d。
输入和输出示例:
>>>function([[x1,y1],[x2,y2],[x3,y3]])
>>>d
答案 0 :(得分:1)
正如我所说,here提出了类似的问题。这是解决方案
a = [(5, 3), (9, 0), (4, 6), (2, 2), (0, 0)]
from math import sqrt
def function(a):
distances = []
def compute(fp, sp):
return sqrt((fp[0]-sp[0])**2 + (fp[1] - sp[1])**2)
for p in a:
b = a[:]
b.remove(p)
distances.append(compute(p, min(b, key=lambda x: compute(x, p))))
return min(distances)
print(function(a))
输出: 2.8284271247461903,等于sqrt(8),因为(2-0) 2 +(2-0) 2 == 8
答案 1 :(得分:1)
像Sukrit所链接的维基百科文章中所示的简单蛮力方法,但效率提升很小:
def min_dist(pair_list):
n = len(pair_list)
new_min_dist = float('inf')
for i in xrange(n):
for j in xrange(i + 1, n):
new_x_dist = pair_list[i][0] - pair_list[j][0]
new_y_dist = pair_list[i][1] - pair_list[j][1]
new_min_dist = min(new_x_dist * new_x_dist + new_y_dist * new_y_dist, new_min_dist)
return new_min_dist ** 0.5
这里有一些效率增加:
** 0.5
代替math.sqrt
,因为对于浮点数,取幂比平方根快。** 2
,因为取幂比乘法要昂贵得多。xrange
使用较少的内存,并且不必分配块,因此它比range
略快,前提是少于约32000个点。 (Python 3语法不同。)