我有一个二维点列表
candidates = [(x1, y1), (x2, y2), (x3, y3), ...]
和一个参考点ref = (x0, y0)
。
我现在希望candidates
根据它们与参考点的欧几里德距离ref
按升序对列表进行排序。
这样做的最 Pythonic 方式是什么?
两点之间的欧几里得距离,(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)
编写一个函数来计算欧几里得距离,并将该函数与函数的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)
的key
参数list.sort()
将允许您传递一个函数,该函数将用于派生每个元素的排序键。
candidates.sort(key=lambda x: distance(ref, x))