La fonction sorted est une fonction built-in qui permet de trier les éléments de n'importe quel itérable. Qu'on lui passe une liste, un tuple, un dictionnaire ou un autre itérable, elle retourne toujours une nouvelle liste avec les éléments triés, ordonnés selon les critères spécifiés, sans modifier l'itérable d'origine.
sorted(iterable, key=None, reverse=False)
-
iterableest l'objet à trier -
key accepte une fonction qui indique comment trier l'itérable (optionnel)
-
reverse indique s'il faut inverser le tri si elle est définie sur
True(optionnel)
Utilisation simple
Utilisons sorted avec avec différents itérables pour voir son comportement par défaut :
# Avec une liste de nombres nombres = [3, 1, 4, 1, 5, 9, 2] nombres_tries = sorted(nombres) print(nombres_tries) # Affiche : [1, 1, 2, 3, 4, 5, 9] print(nombres) # Affiche : [3, 1, 4, 1, 5, 9, 2] (liste originale inchangée) # Avec une chaîne de caractères mot = "python" lettres_triees = sorted(mot) print(lettres_triees) # Affiche : ['h', 'n', 'o', 'p', 't', 'y'] # Avec un dictionnaire (trie les clés par défaut) fruits = {'c': 'cerise', 'a': 'abricot', 'b': 'banane'} cles_triees = sorted(fruits) print(cles_triees) # Affiche : ['a', 'b', 'c']
L'itérable d'origine (nombres, mot, fruits) n'est pas changé.
Personnaliser le tri avec le paramètre key
L'utilisation du paramètre key peut être un peu déroutante, mais extrêmement puissante. Il faut lui passer une fonction qui sera appelée sur chaque élément pour faire la comparaison.
Prenons l'exemple de la liste de mots, qui par défaut est triée par ordre alphabétique. On peut vouloir les trier en fonction de leur longueur :
mots = ["banane", "pomme", "cerise", "abricot"] mots_tries_par_longueur = sorted(mots, key=len) print(mots_tries_par_longueur) # Affiche : ['pomme', 'banane', 'cerise', 'abricot']
Ici sorted utilisera la fonction len pour déterminer l'ordre.
Pour des tris plus complexes, on peut utiliser une fonction anonyme (lambda).
Voici un exemple qui montre comment trier une liste de dictionnaires en fonction de la valeur (ici l'âge) :
etudiants = [ {'nom': 'Alice', 'age': 22}, {'nom': 'Bob', 'age': 20}, {'nom': 'Charlie', 'age': 23}, {'nom': 'David'} # Pas de clé 'age' ] # Utiliser .get('age', 0) pour trier. Si 'age' n'existe pas, on utilise 0 comme valeur par défaut. etudiants_tries_par_age = sorted(etudiants, key=lambda etudiant: etudiant.get('age', 0)) print(etudiants_tries_par_age) # Affiche : [{'nom': 'David'}, {'nom': 'Bob', 'age': 20}, {'nom': 'Alice', 'age': 22}, {'nom': 'Charlie', 'age': 23}]
Pour trier un dictionnaire en fonction de ses valeurs, il faut d'abord le transformer en paires (clé, valeur) avec la méthode .items() :
fruits = {'pommes': 10, 'oranges': 5, 'bananes': 12} fruits_tries_par_quantite = sorted(fruits.items(), key=lambda item: item[1]) print(fruits_tries_par_quantite) # Affiche : [('oranges', 5), ('pommes', 10), ('bananes', 12)]
Poussons le concept un peu plus en utilisant notre propre fonction pour le tri :
def calculer_score_produit(produit): """Calcule un score basé sur la note et le prix d'un produit.""" note = produit.get('note', 0) prix = produit.get('prix', 999) # On favorise les produits bien notés et pas trop chers return note / prix produits = [ {'nom': 'Produit A', 'note': 4.5, 'prix': 10}, # Score: 0.45 {'nom': 'Produit B', 'note': 3.5, 'prix': 5}, # Score: 0.7 {'nom': 'Produit C', 'note': 5.0, 'prix': 25} # Score: 0.2 ] # On trie les produits du meilleur score au moins bon produits_tries_par_score = sorted(produits, key=calculer_score_produit, reverse=True) print(produits_tries_par_score) # Affiche : [{'nom': 'Produit B', 'note': 3.5, 'prix': 5}, {'nom': 'Produit A', 'note': 4.5, 'prix': 10}, {'nom': 'Produit C', 'note': 5.0, 'prix': 25}]
Le tri sera exécuté en fonction du score calculé par la fonction.
Inverser l'ordre de tri avec reverse
Pour inverser l'ordre de tri, il suffit de passer True à reverse :
nombres = [3, 1, 4, 1, 5, 9, 2] nombres_tries_decroissant = sorted(nombres, reverse=True) print(nombres_tries_decroissant) # Affiche : [9, 5, 4, 3, 2, 1, 1]
Différence entre sorted() et list.sort()
-
sorted()retourne une nouvelle liste triée sans modifier l'itérable d'origine. -
liste.sort()s'applique uniquement aux listes et modifie directement la liste originale.
ma_liste = [3, 1, 2] # Utilisation de list.sort() ma_liste.sort() print(f"Liste originale modifiée : {ma_liste}") # Affiche : Liste originale modifiée : [1, 2, 3]
La méthode sort retourne None et modifie la liste directement : vous n'avez donc pas besoin de faire une assignation dans une nouvelle variable pour récupérer le résultat trié. C'est une erreur classique en Python.
liste = [3, 1, 2] liste.sort() # On trie directement la liste print(liste) # Affiche [1, 2, 3] liste = [3, 1, 2] liste = liste.sort() print(liste) # Affiche None