2015-05-10 5 views
0

Если у вас есть список vectors- таких, как так:Сортировка списка векторов питона

myListOfVectors=[(10,2),(0,5),(3,2),(8,2),(9,5),(10,5] 

Что бы самый быстрый способ сортировки этих векторов от мала до велика (при условии, что наименьшее расстояние от начала координат будет первым членом списка, а вторым наименьшим расстоянием будет второй член и т. д.)?

ответ

3
def sqdist(vector) 
    return sum(x*x for x in vector) 

myListOfVectors.sort(key=sqdist) 

Результаты в:

>>> myListOfVectors 
[(3, 2), (0, 5), (8, 2), (10, 2), (9, 5), (10, 5)] 

Я использую квадрат расстояния, как вы на самом деле не использовать расстояние в любом месте, и вычисления квадратного корня является весьма дорогостоящим.

+0

Это было решение pythonic, которое я искал :) –

1

Предполагая, что вы говорите о евклидовом расстоянии от происхождения, вот что я хотел бы сделать:

from math import sqrt 

def euclidean_distance(v): 
    return sqrt(sum(x**2 for x in v)) 

myListOfVectors = [(10,2),(0,5),(3,2),(8,2),(9,5),(10,5)] 

sorted(myListOfVectors, key=euclidean_distance) 

Который возвращает

[(3, 2), (0, 5), (8, 2), (10, 2), (9, 5), (10, 5)] 

Это работает на любом п-мерном множестве векторов.

Смежные вопросы