Qu'est-ce que la fonction sorted en Python ?

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)
  • iterable est 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']
Un instant

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']
Un instant

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}]
Un instant

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)]
Un instant

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}]
Un instant

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]
Un instant

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]
Un instant

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
Un instant

Bravo, tu es prêt à passer à la suite

Rechercher sur le site

Formulaire de contact

Inscris-toi à Docstring

Pour commencer ton apprentissage.

Tu as déjà un compte ? Connecte-toi.