Tengo una gran variedad de vectores y quiero ordenarlos por longitud:__key__ parámetro para las clases en Python
class Vector:
def __init__(self, x, y):
self.x, self.y = x, y
def __add__(a, b):
return Vector(a.x + b.x, a.y + b.y)
def __str__(a):
return str(a.x) + ' ' + str(a.y) + '\n'
def __key__(self):
return self.x * self.x + self.y * self.y
a = []
a.append(Vector(1,2))
a.append(Vector(1, 1))
a.sort()
print("".join(map(str,a)))
Se dice: "tipos unorderable: Vector() < vectorial()" Me quiere para crear lt
, gt
.. métodos. Pero quiero ordenar sin usar cmp
. ¿Es posible?
Tenga en cuenta que es probable que no debe utilizar '__key__' como el nombre de uno de sus métodos. los nombres de métodos entre corchetes por pares de guiones bajos están reservados para medios especiales por la especificación (Esto significa que en cualquier momento, Guido podría decidir que quiere agregar '__key__' como parte del modelo de datos python y su método podría causar algunos bastante interesantes (no deseados)) comportamiento.) – mgilson
Además, si solo está buscando una clase de vector agradable, es posible que desee buscar 'numpy'. Proporciona "ndarray" s que se comportan de manera muy similar a los vectores, admite una forma de indexación muy interesante (y útil) y realiza todas las operaciones matemáticas en C, lo que las hace un poco más rápidas de lo que obtendría al hacer su propio cálculo implementación. – mgilson
@mgilson parece que OP esperaba que '__key__' ya se definiera como parte del modelo de datos de Python, con un comportamiento análogo al parámetro de palabra clave' key' de 'list.sort'. –