PYTHON - 列表中最近对之间的距离

时间:2014-03-30 17:12:34

标签: python

如何编写分析列表或坐标对的函数,使用距离公式选择对是最接近的,然后只返回距离d。

输入和输出示例:

>>>function([[x1,y1],[x2,y2],[x3,y3]])
>>>d

2 个答案:

答案 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语法不同。)