J'étais en train de refactoriser un de mes vieux codes et je suis tombé sur ceci:
alist.sort(cmp_items)
def cmp_items(a, b):
if a.foo > b.foo:
return 1
elif a.foo == b.foo:
return 0
else:
return -1
Le code fonctionne (et je l'ai écrit il y a environ 3 ans!) Mais je ne trouve pas cette chose documentée nulle part dans la documentation Python et tout le monde l'utilise sorted()
pour implémenter le tri personnalisé. Quelqu'un peut-il expliquer pourquoi cela fonctionne?
sorted()
etsort()
offre un tri personnalisé à peu près de la même manière, modulo la différence de convention d'appel.key
paramètre est préférable au passage d'unecmp
fonction. (Ce dernier n'est même pas implémenté dans Python 3)foo
, sinon il explose. Mieux vaut définir une__lt__()
méthode personnalisée pour votre classe, alorssorted()
etlist.sort()
fonctionnera immédiatement. (Btw, les objets n'ont plus besoin de définir__cmp__()
, juste__lt__()
. Voir ceciRéponses:
C'est documenté ici .
la source
cmp
, j'obtiensTypeError: 'cmp' is an invalid keyword argument for this function
. Qu'est-ce qui se passe ici?sort
ne prend pas une fonction de comparaison comme argument dans Python 3, et non comme quelque chose que j'aimerais vraiment faire.En remarque, voici une meilleure alternative pour implémenter le même tri:
Ou bien:
Consultez le Guide de tri , il est très utile.
la source
Tout comme cet exemple. Vous voulez trier cette liste.
production:
vous devez trier les tuples par le deuxième élément, puis le premier:
Finalement:
juste
sort(letter_cmp)
la source
Cela ne fonctionne pas dans Python 3.
Vous pouvez utiliser les functools cmp_to_key pour faire fonctionner les fonctions de comparaison à l'ancienne.
la source
En python3, vous pouvez écrire:
la source
Encore mieux:
Tiré de: https://docs.python.org/3/howto/sorting.html
la source