import math
train = [('A', (0.0, 1000.0)), ('B', (10.0, 0.0))]
query = (9.0, 800.0)
ranges = tuple(max(v[j] for _, v in train)-min(v[j] for _, v in train)
               for j in range(2))
assert all(r > 0 for r in ranges)
def rank(scales):
    distances = [(label, math.sqrt(sum(((a-b)/s)**2
                    for a, b, s in zip(query, point, scales))))
                 for label, point in train]
    return sorted(distances, key=lambda row: (row[1], row[0]))
raw = rank((1.0, 1.0))
scaled = rank(ranges)
print('raw', [(a, round(d, 6)) for a, d in raw])
print('scaled', [(a, round(d, 6)) for a, d in scaled])
assert raw[0][0] == 'A' and scaled[0][0] == 'B'
assert abs(scaled[0][1]-math.sqrt(0.65)) < 1e-12
