Comprendre la fonction triée en Python : un guide simple



Un des atouts majeurs de Python réside dans sa simplicité d’utilisation. Sa bibliothèque standard regorge de fonctionnalités pratiques, ce qui facilite grandement le travail avec ce langage. Parmi celles-ci, la fonction `sorted` occupe une place de choix.

Cette fonction a pour rôle de classer les éléments d’un itérable selon un ordre spécifique. Sans elle, il serait nécessaire d’écrire manuellement un code implémentant un algorithme de tri, tel que le tri à bulles ou le tri par insertion. Ce type d’implémentation peut s’avérer complexe, mais Python simplifie grandement les choses grâce à cette fonction, que nous allons explorer dans cet article.

Présentation de la fonction `sorted`

La fonction `sorted` permet de trier les itérables en Python. Un itérable est une entité sur laquelle il est possible d’effectuer une itération, c’est-à-dire de parcourir ses éléments. Les chaînes de caractères, les listes, les tuples et les ensembles sont des exemples courants d’itérables. Ces collections sont souvent non ordonnées, et la fonction `sorted` permet de les organiser selon un ordre défini. L’intérêt de classer les éléments est multiple :

  • La recherche d’éléments est plus rapide et efficace, notamment grâce à des algorithmes comme la recherche binaire. Toutefois, la recherche binaire nécessite un préalable : que les données soient triées.
  • L’affichage d’informations devient plus pertinent. Les utilisateurs peuvent souhaiter visualiser des données triées, comme les prix du plus bas au plus élevé, ou les messages du plus récent au plus ancien. Cela requiert donc un outil capable de trier une liste d’éléments.
  • L’analyse statistique est facilitée. Par exemple, la recherche de la valeur la plus fréquente dans un ensemble est plus aisée lorsque les valeurs sont triées.

Guide d’utilisation de la fonction `sorted`

Comme mentionné précédemment, la fonction `sorted` fonctionne avec tous les itérables. Elle retourne systématiquement une liste triée. Il est important de noter que, quelle que soit la nature de l’entrée (un itérable quelconque), la sortie sera toujours une liste.

Syntaxe de la fonction `sorted`

La signature de la fonction `sorted` est la suivante :

sorted(iterable, key=None, reverse=False)

Seul l’argument `iterable`, qui est la collection à trier, est obligatoire.

L’argument `key` est optionnel. Il s’agit d’une fonction qui sera appliquée à chaque élément de l’itérable pour extraire une valeur servant de critère de tri. Ceci est particulièrement utile pour trier une liste de dictionnaires, comme nous le verrons par la suite. Si aucun argument `key` n’est spécifié, le tri s’effectuera sur les valeurs brutes des éléments.

Le dernier argument, `reverse`, est un booléen. S’il est défini sur `True`, le tri sera effectué dans l’ordre inverse (décroissant).

Dans la section suivante, nous illustrerons l’utilisation de cette fonction à l’aide d’exemples concrets.

Exemples d’utilisation de la fonction `sorted`

Tri d’une liste de nombres

Le cas le plus élémentaire est le tri d’une liste de nombres. Prenons l’exemple suivant :

# Une liste de nombres non triés
numbers = [8, 4, 3, 9, 2, 0, 3]

# Tri des nombres
sorted_numbers = sorted(numbers)

# Affichage des nombres triés
print(sorted_numbers)

Le résultat sera :

[0, 2, 3, 3, 4, 8, 9]

Comme vous pouvez le constater, les valeurs ont été triées par ordre croissant. Pour effectuer un tri par ordre décroissant, il faudrait définir l’argument `reverse` à `True`. La ligne 4 de l’exemple précédent deviendrait alors :

sorted_numbers = sorted(numbers, reverse=True)

Le résultat de l’exécution de ce code modifié serait :

[9, 8, 4, 3, 3, 2, 0]

Tri d’une liste de chaînes de caractères

La fonction `sorted` ne se limite pas aux nombres. Elle peut également être utilisée pour trier des chaînes de caractères. Pour ce faire, elle compare les caractères un à un, en commençant par le premier. La comparaison se base sur les valeurs ASCII des caractères. Par exemple, ‘hello’ précédera ‘world’ car la valeur ASCII de ‘h’ (104) est inférieure à celle de ‘w’ (119).

Si plusieurs chaînes partagent le même premier caractère, la comparaison se poursuit avec le deuxième caractère, puis le troisième, et ainsi de suite, jusqu’à ce qu’un ordre soit établi. Voici un exemple de tri d’une liste de noms :

# Création d'une liste de noms
members_list = ['bob', 'dave', 'charlie', 'alice']

# Tri des noms
sorted_members_list = sorted(members_list)

# Affichage des noms triés
print(sorted_members_list)

Ce code produira le résultat suivant :

['alice', 'bob', 'charlie', 'dave']

L’ordre des chaînes dépend donc de l’ordre des caractères dans la table ASCII. Il est important de noter que les majuscules précèdent les minuscules dans cette table. Voici un tableau ASCII complet à titre de référence :

Source : commons.wikimedia.org

Autres itérables : chaînes, tuples et ensembles

Comme nous l’avons mentionné, la fonction `sorted` fonctionne avec tous les types d’itérables. Les mêmes règles de tri s’appliquent dans tous les cas. Voici un exemple :

# Affichage d'une chaîne triée
print(sorted("dijkstra"))

# Affichage d'un tuple trié
print(sorted((3, 4, 2, 1, 5, 0)))

# Affichage d'un ensemble trié
print(sorted(set([4, 5, 5, 1, 3, 8, 9])))

Le résultat sera :

['a', 'd', 'i', 'j', 'k', 'r', 's', 't']
[0, 1, 2, 3, 4, 5]
[1, 3, 4, 5, 8, 9]

Dans tous les cas, la fonction retourne une liste triée.

Tri d’une liste de dictionnaires

Il est également possible d’utiliser la fonction `sorted` pour trier une liste de dictionnaires. Cependant, le tri de dictionnaires est légèrement plus complexe, car un dictionnaire est composé de plusieurs paires clé-valeur, chacune pouvant potentiellement servir de critère de comparaison.

Pour trier des dictionnaires, il est nécessaire de spécifier une fonction qui extraira de chaque dictionnaire une valeur qui servira de base à la comparaison. Cette fonction est passée à la fonction `sorted` via l’argument `key`. L’exemple suivant illustre cette approche :

people = [
        { 'name': 'Alice', 'age': 27 },
        { 'name': 'Bob', 'age':  23 },
        { 'name': 'Charlie', 'age': 25}
]

people_sorted_by_age = sorted(people, key=lambda person: person['age'])
print(people_sorted_by_age)

Dans cet exemple, nous avons une liste de trois personnes, chacune représentée par un dictionnaire contenant son nom et son âge. Nous souhaitons trier ces personnes par âge. Pour cela, nous passons à la fonction `sorted` une fonction anonyme (lambda) qui prend un dictionnaire en entrée et retourne l’âge de la personne. La valeur retournée par cette fonction est utilisée pour le tri. Ainsi, l’ensemble du dictionnaire est réduit à une simple valeur numérique qui peut être comparée. Nous avons utilisé une fonction lambda pour simplifier la définition de l’argument `key`.

L’exécution de ce code produira le résultat suivant :

[{'name': 'Bob', 'age': 23}, {'name': 'Charlie', 'age': 25}, {'name': 'Alice', 'age': 27}]

Cas d’utilisation de l’argument `key`

L’argument `key` n’est pas limité au tri de dictionnaires. Il peut être utilisé pour tout type de données. Son rôle est de fournir une clé de tri. Voici quelques exemples :

  • Trier des valeurs en fonction de leur longueur : définir une fonction `key` qui prend une valeur en entrée et retourne sa longueur.
  • Trier des chaînes de caractères sans tenir compte de la casse : convertir chaque chaîne en minuscules en utilisant une fonction `key` appropriée.
  • Trier des données en fonction d’une valeur composite, obtenue en combinant plusieurs champs.

Complexité temporelle de la fonction `sorted`

La fonction `sorted` possède une complexité temporelle de O(n log n), où n est le nombre d’éléments dans l’itérable d’entrée. Cette complexité est due à l’algorithme Timsort utilisé en interne, un algorithme hybride basé sur le tri fusion et le tri par insertion.

La complexité spatiale est quant à elle de O(n), car une nouvelle liste est créée et retournée.

Comparaison entre la fonction `sorted` et la méthode `sort`

Une autre option pour trier des listes est la méthode `sort` des objets `list`. Cette section met en lumière les principales différences entre les deux approches.

  • La méthode `sort` modifie la liste en place, tandis que la fonction `sorted` crée une nouvelle liste triée sans altérer la liste d’origine.
  • La méthode `sort` ne peut être appliquée qu’à des listes, tandis que la fonction `sorted` accepte n’importe quel itérable en entrée et retourne toujours une nouvelle liste triée.

Conclusion

Dans cet article, nous avons exploré la fonction `sorted` : son rôle, sa syntaxe, ses arguments, et ses cas d’utilisation. Nous avons également discuté de sa complexité temporelle et spatiale, et nous l’avons comparée à la méthode `sort`.

Pour approfondir vos connaissances, vous pouvez consulter notre article sur la fonction `sum` de Python.