ProgrammationDéveloppeur Backend

Comment fonctionne la méthode sort() pour les listes en Python, quelle est la différence avec la fonction sorted(), quels sont les paramètres importants, les nuances d'utilisation et les pièges possibles ?

Réussissez les entretiens avec l'assistant IA Hintsage

Réponse

Historique de la question : La méthode sort() est intégrée au type list depuis les premières versions de Python, tandis que la fonction sorted() est apparue dans Python 2.4. Le tri des collections est l'une des tâches les plus courantes en programmation, et Python propose deux outils principaux pour le résoudre.

Problème : Beaucoup de débutants confondent sort() (méthode de liste) et sorted() (fonction de haut niveau). Il n'y a pas de compréhension sur quand utiliser le tri in-place, quels objets peuvent être triés, comment définir un ordre arbitraire via key/reverse, et quelles pièges cela peut entraîner, notamment pour des structures utilisateur complexes.

Solution :

  • list.sort() trie la liste originale sur place et retourne None. Il modifie l'objet d'origine.
  • sorted() renvoie une nouvelle liste triée (ou un autre type si passé autrement), sans modifier l'original. Il fonctionne avec tout objet itérable (y compris les générateurs).
  • Les deux méthodes prennent en charge les paramètres key (fonction de tri) et reverse (drapeau logique pour trier dans l'ordre inverse).

Exemple de code :

numbers = [5, 2, 9, 1] numbers.sort() # numbers = [1, 2, 5, 9] words = ['aaa', 'ZZZ', 'bbb'] sorted_words = sorted(words, key=str.lower, reverse=True) # sorted_words = ['ZZZ', 'bbb', 'aaa'] # words reste inchangé

Caractéristiques clés :

  • sort() ne fonctionne que pour les listes et trie sur place (in-place), sorted() est plus universelle — elle fonctionne avec tout objet itérable.
  • Personnalisation du tri via le paramètre key — pratique pour trier par lambda ou attribut d'objet.
  • Il est important de ne pas confondre que sort retourne None, ce qui mène souvent à des erreurs lors d'une affectation accidentelle.

Questions piégées.

Que va retourner la variable si on fait my_list = my_list.sort() ?

Réponse : my_list sera None, car sort trie la liste sur place et retourne None. C'est un bug courant : triez toujours in-place sans affectation, ou utilisez sorted si vous avez besoin d'un objet trié comme nouvelle liste.

Exemple de code :

lst = [3, 1, 2] lst = lst.sort() # lst est maintenant None

Peut-on trier un tuple ou une chaîne avec la méthode sort() ?

Réponse : Non, les objets immuables (tuple, str) n'ont pas de méthode sort, mais sorted() peut être appliqué, ce qui renvoie une nouvelle liste triée des éléments.

Exemple de code :

tpl = (4, 2, 7) sorted_tpl = sorted(tpl) # sorted_tpl = [2, 4, 7]

Peut-on trier une liste avec des éléments de types différents ?

Réponse : En Python 3, le tri de différents types non comparables (par exemple, int et str) entraîne une TypeError. En Python 2, il y avait un ordre spécifique, maintenant il faut spécifier explicitement une fonction key pour généraliser toutes les valeurs en une forme comparable.

Erreurs typiques et anti-patrons

  • Avoir confondu le retour de sort/sorted — perte de données.
  • Essayer de trier des objets de types non comparables sans key — vous obtiendrez une exception.
  • Trier de grandes collections in-place, lorsque “l'original” est requis.
  • Utiliser des fonctions key lourdes, ralentissant considérablement le tri.

Exemple de la vie réelle

Cas négatif

Le programmeur a fait my_list = my_list.sort(), après quoi il a perdu l'accès à la liste originale, car la variable a été assignée à la valeur None.

Avantages :

  • La syntaxe semble "logique" (pour les débutants)

Inconvénients :

  • Perte d'accès aux données, le bug peut être facilement manqué dans de grands projets, crash de l'application à l'exécution.

Cas positif

Utilisation soigneuse de sorted() pour obtenir une nouvelle version sans modifier l'original ou application correcte de sort sans affectation.

Avantages :

  • Comportement explicite, préservation des données d'origine.
  • Flexibilité pour les objets itérables (et pas seulement pour les listes)

Inconvénients :

  • Avec sorted, une copie est créée — plus coûteuse en mémoire pour de très grandes collections.