Ho una serie di vettori e voglio ordinarli per lunghezza:__key__ parametro per le classi in 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)))
si dice: "tipi non ordinabile: Vector() < Vector()" Mi vuole creare i metodi lt
, gt
... Ma voglio ordinare senza usare cmp
. È possibile?
si noti che probabilmente non dovrebbe usare '__key__' come il nome di uno dei tuoi metodi. i nomi dei metodi messi tra parentesi da coppie di caratteri di sottolineatura sono riservati per mezzo speciale dalla specifica (questo significa che in qualsiasi momento Guido potrebbe decidere di aggiungere '__key__' come parte del modello di dati python e il tuo metodo potrebbe risultare piuttosto interessante (indesiderato).) – mgilson
Inoltre, se stai solo cercando una buona classe vettoriale, potresti voler dare un'occhiata a 'numpy'. Fornisce "ndarray" che si comportano in modo molto simile ai vettori, supportano una forma di indicizzazione molto interessante (e utile) e fanno tutte le operazioni matematiche in C che li rende un po 'più veloci di quelli che otterresti con il rollover implementazione. – mgilson
@mgilson sembra che OP si aspettasse che '__key__' sia già definito come parte del modello di dati Python, con un comportamento analogo al parametro chiave' key' su 'list.sort'. –