4

我有一个二维点列表

candidates = [(x1, y1), (x2, y2), (x3, y3), ...]

和一个参考点ref = (x0, y0)

我现在希望candidates根据它们与参考点的欧几里德距离ref按升序对列表进行排序。

这样做的最 Pythonic 方式是什么?

4

3 回答 3

10

两点之间的欧几里得距离,(x1, y1)(x2, y2)下式给出:

sqrt((x1 - y1)^2 + (x2 - y2)^2))

要对列表进行排序,您可以使用公式,也可以跳过sqrt部分,因为您只是进行比较,而不是计算实际距离。IE:

if x > y then sqrt(x) > sqrt(y)

因此,以下将起作用:

ref = (x0, y0)
candidates = [(x1, y1), (x2, y2), (x3, y3), ...]

candidates.sort(key=lambda x: (x[0] - ref[0]) ** 2 + (x[1] - ref[1]) ** 2)
于 2013-10-05T13:45:49.970 回答
8

编写一个函数来计算欧几里得距离,并将该函数与函数的key参数一起使用list.sort

ref = (x0, y0)
def euclidean(coords):
    xx, yy = ref
    x, y = coords
    return ((x-xx)**2 + (y-yy)**2)**0.5

candidates = [(x1, y1), (x2, y2), (x3, y3), ...]
candidates.sort(key=euclidean)
于 2013-10-05T13:39:49.443 回答
2

key参数list.sort()将允许您传递一个函数,该函数将用于派生每个元素的排序键。

candidates.sort(key=lambda x: distance(ref, x))
于 2013-10-05T13:39:41.227 回答