Cet article et tout le monde parlent de Python, comme de nombreuses langues seniors, des fonctions d'arrangement mature Python emballées. Nous devons juste appeler la fonction d'arrangement interne, vous pouvez compléter l'arrangement. Cependant, parmi les scénarios réels, les applications de tri sont souvent plus complexes, telles que des types d'objets, de nombreux champs, nous voulons trier en fonction des champs spécifiés ou souhaitez être triés par de nombreux mots-clés, ce n'est pas une commande d'appel de fonction simple. pour le résoudre.
Voir d'abord les scènes triés par le dictionnaire le plus populaire, supposons que nous ayons un dictionnaire une tableaux, il y a beaucoup d'écoles dans le dictionnaire. Nous espérons être organisés dans un domaine dans un dictionnaire, nous utilisons les données réelles pour donner un exemple:
Les enfants ici sont un type de dict, il existe trois noms, points et accusations d'âge. Supposons que nous espérons être arrangés en fonction du score, je devrais fairequelle?
kids = [ {'name': 'xiaoming', 'score': 99, 'age': 12}, {'name': 'xiaohong', 'score': 75, 'age': 13}, {'name': 'xiaowang', 'score': 88, 'age': 15}]
Pour ce problème, il existe d'abord de nombreuses solutions, nous pouvons tout d'abord utiliser les fonctions anonymes mentionnées dans l'article précédent pour spécifier le tri. L'utilisation et les articles mentionnés ci-dessus sont les mêmes, nous répondons directement au code:
Dans la fonction anonyme, nous avons reçu x pour les enfants. Facteurs, c'est un dict, nous souhaitons donc affecter les écoles que nous souhaitons et vous devez utiliser les éléments d'accès à dicter, qui trouve la valeur de champ correspondant aux parenthèses. Si nous voulons organiser des mots-clés
de mots-clés
sorted(kids, key=lambda x: x['score'])
Introduisez d'abord de plusieurs mots-clés ou dans les données ci-dessus. Parmi les exemples ci-dessus, le score de tous les enfants est différent, le résultat des résultats est donc déterminé. Mais s'il y a deux points de tous, j'espère que les anciens rangs devant, que dois-je faire?
Nous analysons que nous analysons que les scores sont de petits à grands, mais peuvent exporter hégal. À ce stade, nous espérons comparer l'âge en fonction de la situation du score, c'est-à-dire que nous voulons trier par deux mots-clés , le premier mot-clé est le score, le deuxième mot clé est l'âge.
Comprenez cela, c'est vraiment bien. Nous devons simplement la modifier dans des fonctions anonymes, laissez-le renvoyer les résultats pour ajouter un champ.
Rubrique
Outre les fonctions anonymes, Python a également une bibliothèque pouvant résoudre ce problème. Les fonctions anonymes utilisées et très proches sont plus faciles à utiliser. Ceci est la fonction d'itemGetter dans la bibliothèque d'exploitation. Nous pouvons voir le code directement:
Si vous êtes le mot clé, vous pouvez passer beaucoupVerrouillage:
Lundi, Obtenez l'objet
sorted(kids, key=lambda x: (x['score'], x['age']))
from operator import itemgettersorted(kids, key=itemgetter('score'))
sorted(kids, key=itemgetter('score', 'age'))
Objet
Objetclass Kid: def __init__(self, name, score, age): self.name = name self.score = score self.age = age def __repr__(self): return 'Kid, name: {}, score: {}, age:{}'.format(self.name, self.score, self.age)
Dispositions personnalisées, d'abord, nous écrivons dict ci-dessus:
pour faciliter l'observation de la Résultats d'impression, nous avons surchargé la méthode __RPR__ que vous devez simplement utiliser comme méthode de tôt en Java, afin que nous puissions spécifier la sortie lors de l'impression. De même, l'opérateur fournit également les fonctions de coefficient appropriées, l'utilisation, comme ItTueGetter, juste un nom différent.
from operator import attrgetterkids = [Kid('xiaoming', 99, 12), Kid('xiaohong', 75, 13), Kid('xiaowang', 88, 15)]sorted(kids, key=attrgetter('score'))
sorted(kids, key=lambda x: x.score)
Mardi, arrangé sur mesure
ordre croissant de mots-clés, ordre décroissant Mots-clés
? Par exemple, par exemple, nous voulons décider de la différence, de l'âge ascendant, il n'ya aucun moyen de le résoudre par reprise, ce qui est le problème que le règlement actuel ne peut pas être résolu.Que dois-je faire? À ce stade, vous avez besoin du dernier meurtre pour jouer, c'est-à-dire la définition de la définition du titre. Cela signifie que nous faisons une fonction pour déterminer la taille de l'élément, puis pour organiser appelez-nous pour terminer le tri. C'est aussi un moyen d'utiliser C ++ et Java. Les fonctions personnalisées ne sont pas difficiles à écrire, nous arriverons:
Si vous ne comprenez pas, j'ai un problème, j'ai écrit une version complète:
Après écrit, il n'est toujours pas terminé. Cette fonction ne peut pas être utilisée directement et il n'est pas identique à la fonction de Lambda cachée à l'avanceÓ. La fonction anonyme précédente n'est utilisée que pour indiquer le champ. Nous ne pouvons donc pas transférer cette fonction directement sur la clé et nous devons avoir une couche de traitement externe. Toutefois, cette fonction de traitement de la classe Python a également un outil prêt, nous pouvons appeler directement, il est dans fonctionnement, voir code:
def cmp(kid1, kid2): return kid1.age < kid2.age if kid1.score == kid2.score else kid1.score > kid2.score
Voyons le code source dans le CMP_TO_KEY: