我具有2-d點根據度量對候選列表進行排序 - Python?
candidates = [(x1, y1), (x2, y2), (x3, y3), ...]
列表和參考點ref = (x0, y0)
。
我現在想根據它們與參考點ref
的歐氏距離按升序對candidates
列表進行排序。
什麼是最Python的方法這樣做?
我具有2-d點根據度量對候選列表進行排序 - Python?
candidates = [(x1, y1), (x2, y2), (x3, y3), ...]
列表和參考點ref = (x0, y0)
。
我現在想根據它們與參考點ref
的歐氏距離按升序對candidates
列表進行排序。
什麼是最Python的方法這樣做?
歐氏距離由下式給出:
sqrt((x1 - y1)^2 + (x2 - y2)^2))
排序列表中,您可以用公式,也可以跳過sqrt
部分,因爲你只是做比較,而不是計算實際距離。即:
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()
將允許您傳遞將用於派生每個元素的排序關鍵字的函數。
candidates.sort(key=lambda x: distance(ref, x))
寫函數來計算歐幾里得距離,並使用該函數與list.sort
函數的key
參數。
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)
兩點
(x1, y1)
和
(x2, y2)
之間
我會用'math.sqrt(X)'取代'X ** 5',這是約30%的速度。同樣,'x * x - 2 * x * xx + xx * xx'比'(x-xx)** 2'更快。 –
@TimPietzcker我同意'math.sqrt(x)'更具可讀性,但函數調用總是比** .5更慢。 –
直直而清晰。但是,我想知道是否有可能使其成爲單線? –