Python Quizz: Trier une liste de nombre

Publié le 01 octobre 2010 par Luc

Je vous propose de mieux découvrir Python sous la forme de petits quizz qui reviendront de manière plus ou moins régulière. Des petits exercices simples ou plus complexes selon l'humeur pour mettre en lumière une fonctionnalité du langage. Pour le quizz du jour: J'ai une liste de nombres représentés comme des chaînes de caractère. Je veux les trier en fonction de la valeur de chaque nombre.

>>> nombres = ["28", "144", "98", "514"]
>>> nombres.sort()
>>> print nombres
['144', '28', '514', '98']

Comment faire pour obtenir la liste ordonnee de la manière suivante?
['28', '98', '144', '514']

Mise à jour: Voici la réponse

Après un week-end de réflexion voici la réponse. Merci à goulwen pour sa proposition qui effectivement fonctionne mais n'est pas la réponse que j'ai choisie.

En regardant la doc de la fonction sort, on voit qu'il est possible de passer des fonctions pour ordonner les éléments.

sort(...)
   L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*;
   cmp(x, y) -> -1, 0, 1

On peut passer une fonction de comparaison (argument cmp) qui doit retourner -1, 0 ou 1 en fonction des valeurs des membres à comparer. Mais il est aussi possible de passer une fonction key. Cell-ci sera appelée pour chaque élément de liste et permettra de lui associer une clé utilisée pour le tri des éléments. Plutôt que de trier les éléments en fonction de leurs valeurs, la fonction sort va les trier selon les valeurs retournées par la fonction passée via l'argument key.

Avec l'aide de la fonction suivante, notre tri se fera ainsi dans l'ordre souhaité:

def valeur_entiere(elt):
   return int(elt)
nombres.sort(key=valeur_entiere)

Notre fonction key est très simple et comme en Python, on aime bien avoir du code concis, je vous propose d'améliorer la solution précédente en utilisant une fonction anonyme lambda.

Les lambdas sont des fonctions qui prennent un ou plusieurs arguments et retournent une valeur. Elles contiennent très souvent une seule instruction celle qui définit la valeur à retourner. Avantage: elles évitent d'avoir à déclarer une fonction. A mon sens, lorsqu'elles sont utilisées à bon escient, les lambdas améliorent la lisibilité du code: il est plus court et défini au moment de son utilisation.

Dans notre cas, on peut avantageusement remplacer la fonction valeur_entiere par une lamba. Notre solution ne compte alors plus qu'une seule ligne de code:

nombres.sort(key=lambda elt: int(elt))

Voila c'est tout pour ce quizz qui j'espère vous à montrer qu'il est très facile de trier les éléments d'une liste dans l'ordre que l'on souhaite.