Cours de Python / Ajouter, modifier, supprimer et trier les éléments d’une liste

Une liste Python conserve des éléments dans un ordre et permet de les ajouter, les remplacer ou les supprimer. Pour éviter de perdre vos données, distinguez les méthodes qui modifient la liste existante, comme sort(), des fonctions qui fournissent une nouvelle liste, comme sorted().

Choisir une opération selon son rôle

Une liste se crée avec des crochets, par exemple [3500, 8000, 2500]. Son premier élément porte l’index 0. Une affectation à un index remplace un élément, tandis qu’une tranche peut sélectionner une partie. Les doublons sont autorisés. Une liste peut mélanger plusieurs types, mais des valeurs destinées à une somme doivent garder un sens et une unité cohérents.

Besoin Expression Comportement à vérifier
Ajouter un élément items.append(value) Une liste donnée en argument devient un seul élément imbriqué
Ajouter plusieurs éléments items.extend(values) Ajoute successivement les éléments de l’itérable
Supprimer par position items.pop(index) Renvoie l’élément supprimé
Supprimer par valeur items.remove(value) Supprime la première correspondance ; erreur si elle est absente

Sans index, pop() retire le dernier élément. Ainsi, append suivi de pop peut servir à ajouter puis récupérer le dernier élément. La présentation des méthodes de liste précise leurs arguments et leurs valeurs de retour.

Exécuter les modifications et les deux tris

Python 3 et sa bibliothèque standard suffisent. Enregistrez le code complet suivant dans lists.py, en UTF-8, dans un dossier d’exercice. Depuis un terminal ouvert dans ce dossier avec l’environnement virtuel du projet activé, lancez python lists.py. Sur macOS ou Ubuntu hors environnement virtuel, utilisez python3 si c’est le nom de votre interpréteur.

amounts = [3500, 8000, 2500]
amounts.append(1000)
amounts[0] = 4000
removed = amounts.pop()
print(amounts, removed)
print(sorted(amounts))
print(amounts)
amounts.sort()
print(amounts)

La sortie attendue est :

[4000, 8000, 2500] 1000
[2500, 4000, 8000]
[4000, 8000, 2500]
[2500, 4000, 8000]

La liste commence par trois montants. append ajoute 1000, l’affectation remplace 3500 par 4000 et pop retire le dernier élément : removed reçoit donc 1000. Il reste [4000, 8000, 2500]. Les montants ne sont ni convertis ni additionnés par ces opérations.

Le premier affichage trié vient de sorted : la ligne suivante montre que la liste originale conserve encore son ordre. Après l’appel à sort, le dernier affichage montre la liste elle-même triée. Lisez ces deux lignes ensemble pour distinguer l’apparence d’un résultat et l’état de la donnée d’origine.

Séparer modification, valeur de retour et copie

Opération Valeur renvoyée Liste d’origine
items.sort() None Modifiée sur place
sorted(items) Une nouvelle liste Ordre conservé

Écrire amounts = amounts.sort() associe donc le nom amounts à None, pas à une liste triée. Pour trier l’existant, appelez seulement amounts.sort(). Pour conserver l’original et nommer le résultat trié, utilisez ordered = sorted(amounts). Une méthode qui change un objet ne renvoie pas forcément cet objet.

L’affectation other = amounts ne fait aucune copie : les deux noms désignent la même liste. Avec other = amounts[:], la liste extérieure est copiée, mais les objets mutables imbriqués restent partagés. Si la liste contient une autre liste, une modification de cette liste intérieure peut encore être visible depuis les deux copies. Le module copy et ses explications sur les copies superficielles et profondes détaillent cette distinction. Le tri n’est pas une opération de copie profonde.

Contrôler les listes vides et les changements pendant un parcours

Lire [][0] ou appeler [].pop() lève une IndexError. Décidez si une liste vide est un cas normal : si oui, vérifiez sa présence d’éléments avant une lecture qui l’exige ; sinon, signalez que les données requises manquent. De même, remove lève une ValueError lorsque la valeur demandée est absente. Il ne supprime qu’une occurrence lorsque la valeur apparaît plusieurs fois.

Supprimer des éléments de la liste que vous parcourez déplace leurs positions et peut en faire sauter. Parcourir une copie, par exemple for value in items[:]:, laisse la séquence du parcours indépendante des suppressions de la liste extérieure. Construire une nouvelle liste filtrée est une autre possibilité ; choisissez la méthode selon le résultat voulu.

  1. Dans une copie du programme, ajoutez seulement 0 à la liste initiale, après 2500. Après les mêmes opérations, la première liste affichée contient quatre éléments, dont 0. Son tri commence par 0. La somme finale reste 14500, mais la taille et la structure changent.
  2. Rétablissez la liste initiale à trois éléments et relancez le fichier complet pour retrouver les quatre lignes de sortie données plus haut.
  3. Essayez séparément de retirer une valeur absente avec [1, 2].remove(3), puis un élément d’une liste vide avec [].pop(). Identifiez ValueError et IndexError avant de décider comment gérer chaque situation.

Si vous obtenez None à la place de votre liste, cherchez d’abord une affectation du résultat de sort, append ou extend. Si deux variables semblent changer ensemble, vérifiez si elles désignent le même objet ou partagent un objet intérieur. Ces contrôles permettent de corriger la cause plutôt que de recréer les données sans comprendre leur modification.