En Python 3, vous ne pouvez plus passer une fonction de comparaison à une fonction triée, mais en Python 3.2 vous pouvez utiliser functools.cmp_to_key pour faire la même chose que passer une fonction de comparaison à une fonction triée. Écrivons quelques exemples.
Tout d'abord, écrivons un exemple qui compare et trie les entiers par chaînes.
python
from functools import cmp_to_key
def cmp(a, b):
if a == b: return 0
return -1 if a < b else 1
def cmpstr(a, b):
return cmp(str(a), str(b))
def main():
xs = [4, 90, -9, 12, 42]
print(sorted(xs, key=cmp_to_key(cmpstr)))
main()
C'est le résultat de l'exécution.
[-9, 12, 4, 42, 90]
Le résultat de la comparaison d'amplitude renvoie -1, 0 ou 1. Renvoie -1 si moins, 0 si égal, 1 si plus grand.
Cependant, dans cet exemple uniquement, écrire «sorted (xs, key = str)» est identique.
Maintenant que je sais comment utiliser functools.cmp_to_key
, je vais essayer le tri que je voulais vraiment faire. J'ai une liste de tuples avec deux éléments et je veux trier cette liste. La méthode de comparaison trie le deuxième élément du taple dans l'ordre croissant et, si le deuxième élément est égal, dans l'ordre décroissant du premier élément. La fonction de comparaison est la suivante.
python
from functools import cmp_to_key
def cmp(a, b):
if a == b: return 0
return -1 if a < b else 1
def cmptuple(a, b):
return cmp(a[1], b[1]) or cmp(b[0], a[0])
def main():
xs = [(4, 90), (-9, 12), (42, 12), (100, 12), (1, 1), (-123, 1)]
print(sorted(xs, key=cmp_to_key(cmptuple)))
main()
C'est le résultat de l'exécution.
[(1, 1), (-123, 1), (100, 12), (42, 12), (-9, 12), (4, 90)]
Recommended Posts