7 votes

Paramètre __key__ pour les classes en Python

J'ai un tableau de vecteurs et je veux les trier par longueur :

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)))

Il est dit : "types non ordonnables : Vector() < Vector()" Il veut que je crée lt , gt .. méthodes. Mais je veux trier sans utiliser cmp . Est-ce possible ?

7voto

mgilson Points 92954

Je mettrais en œuvre __lt__ y __eq__ et ensuite utiliser le functools.total_ordering pour obtenir le reste des méthodes de comparaison.

Si cela n'a pas de sens d'avoir vos vecteurs ordonnés de cette manière, vous pouvez toujours utiliser la fonction key mot-clé pour sort (ou sorted d'ailleurs) :

mylist.sort(key = lambda v: v.x**2 + v.y**2)

6voto

Alexey Kachayev Points 3491

Vous avez deux variantes ici : mettre en œuvre __cmp__ fonction dans Vector ou effectuer un tri de cette manière :

...
a.sort(key=Vector.__key__)

2voto

Cédric Julien Points 24177

Python docs dit que lt/le/gt/ge/eq/ne sont

[...] les méthodes dites de " comparaison riche ", et sont appelées pour les les opérateurs de comparaison de préférence à __cmp__()

Si vous mettez en œuvre un __cmp__(self, other) elle doit être utilisée pour les opérations de comparaison/tri.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X