Aller au contenu

Les listes

Jusqu’à maintenant, nous manipulions une donnée ou caractéristique à la fois (ex: un nom, une note, une option), même lorsqu’il y en avait plusieurs en séries. Il fallait également définir de multiples variables si nous voulions préserver plusieurs valeurs, même s’il faisait partie d’un tout.

# 5 étudiants — déjà lourd (imagine 100!)
note_1 = 85
note_2 = 92
note_3 = 78
note_4 = 95
note_5 = 88
moyenne = (note_1 + note_2 + note_3 + note_4 + note_5) / 5
print("Moyenne :", moyenne)

Et si le nombre d’étudiants change ? Il faut réécrire le programme. On a besoin d’une structure qui regroupe plusieurs valeurs sous un seul nom.


En Python, une liste est une collection ordonnée de valeurs, délimitée par des crochets [].

notes = [85, 92, 78, 95, 88]

Le même problème de moyenne, plus haut, devient :

notes = [85, 92, 78, 95, 88]
moyenne = sum(notes) / len(notes)
print("Moyenne :", moyenne)

Une liste peut contenir n’importe quel type de données.

entiers = [1, 2, 3, 4, 5]
decimaux = [3.14, 2.71, 1.41]
mots = ["Alice", "Bob", "Charlie"]
booleens = [True, False, True, True]
vide = []

Une liste peut même contenir un mélange de types :

etudiant = ["Alice", 20, 87.5, True]

Une liste vide se crée avec [] ou list(). Elle contient zéro élément.

panier = []
commandes = list()

C’est utile quand tu veux construire une liste progressivement.


Chaque élément d’une liste a un indice (index), qui commence à 0. L’indice est comme une étiquette qui permet de facilement repérer (positionner) un élément dans la liste.

fruits = ["pomme", "banane", "cerise", "datte", "figue"]
# 0 1 2 3 4
print(fruits[0]) # Premier élément
print(fruits[2]) # Troisième élément
print(fruits[4]) # Dernier élément
pomme
cerise
figue

Python permet d’accéder aux éléments depuis la fin avec des indices négatifs.

fruits = ["pomme", "banane", "cerise", "datte", "figue"]
# 0 1 2 3 4
# -5 -4 -3 -2 -1
print(fruits[-1]) # Dernier élément
print(fruits[-2]) # Avant-dernier
figue
datte

-1 est toujours le dernier, -2 l’avant-dernier, et ainsi de suite.

fruits = ["pomme", "banane", "cerise"]
print(fruits[5])
IndexError: list index out of range

Pour modifier un élément, il suffit d’affecter une nouvelle valeur à la position (indice) de l’élément dans la liste.

Exemple: Si on souhaite remplacer banane par mangue dans cette liste

fruits = ["pomme", "banane", "cerise"]
fruits[1] = "mangue"
print(fruits)
['pomme', 'mangue', 'cerise']

Le tranchage permet d’extraire une sous-liste avec la syntaxe liste[debut:fin].

nombres = [10, 20, 30, 40, 50, 60, 70]
ExpressionRésultatDescription
nombres[1:4][20, 30, 40]De l’indice 1 à 3 (4 exclu)
nombres[:3][10, 20, 30]Du début à l’indice 2
nombres[4:][50, 60, 70]De l’indice 4 à la fin
nombres[:][10, 20, 30, 40, 50, 60, 70]Copie complète
nombres[::2][10, 30, 50, 70]Un élément sur deux
nombres[::-1][70, 60, 50, 40, 30, 20, 10]Liste inversée

Le tranchage crée toujours une nouvelle liste. L’originale n’est pas modifiée.

Pour obtenir une liste indépendante :

a = [1, 2, 3]
# Méthode 1 : tranchage complet
b = a[:]
# Méthode 2 : constructeur list()
c = list(a)
b[0] = 99
c[0] = -1
print("a :", a)
print("b :", b)
print("c :", c)
a : [1, 2, 3]
b : [99, 2, 3]
c : [-1, 2, 3]

Les trois listes sont maintenant indépendantes.


fruits = ["pomme", "banane"]
# À la fin
fruits.append("cerise")
print(fruits)
# À une position précise
fruits.insert(1, "mangue")
print(fruits)
# Plusieurs éléments à la fin
fruits.extend(["kiwi", "figue"])
print(fruits)
['pomme', 'banane', 'cerise']
['pomme', 'mangue', 'banane', 'cerise']
['pomme', 'mangue', 'banane', 'cerise', 'kiwi', 'figue']
fruits = ["pomme", "mangue", "banane", "cerise", "kiwi"]
# Par valeur (retire la première occurrence)
fruits.remove("mangue")
print(fruits)
# Par indice (retire et retourne l'élément)
dernier = fruits.pop()
print("Retiré :", dernier)
print(fruits)
['pomme', 'banane', 'cerise', 'kiwi']
Retiré : kiwi
['pomme', 'banane', 'cerise']

Les opérateurs + et * fonctionnent sur les listes, comme sur les chaînes.

a = [1, 2, 3]
b = [4, 5, 6]
print(a + b)
print(a * 3)
[1, 2, 3, 4, 5, 6]
[1, 2, 3, 1, 2, 3, 1, 2, 3]

L’opérateur in vérifie si un élément existe dans une liste.

fruits = ["pomme", "banane", "cerise"]
print("banane" in fruits)
print("mangue" in fruits)
print("mangue" not in fruits)
True
False
True

Avec des variables simples, b = a crée une copie :

a = 10
b = a # b reçoit une copie de 10
b = 99
print(a) # 10 — a n'a pas changé

Avec des listes, b = a copie la référence, pas les données :

a = [1, 2, 3]
b = a # b pointe vers la MÊME liste que a
b[0] = 99
print(a)
[99, 2, 3]

Maintenant qu’on dispose de listes, certains problèmes deviennent beaucoup plus simples.

Avant les listes, trouver le maximum de 5 valeurs saisies demandait un patron compliqué :

maximum = float("-inf")
for i in range(5):
valeur = int(input("Entrez un nombre : "))
if valeur > maximum:
maximum = valeur
print("Maximum :", maximum)

On ne garde que le maximum. Impossible de revenir sur les valeurs.

valeurs = []
for i in range(5):
nombre = int(input("Entrez un nombre : "))
valeurs.append(nombre)
print("Maximum :", max(valeurs))
print("Minimum :", min(valeurs))
print("Moyenne :", sum(valeurs) / len(valeurs))
print("Toutes les valeurs :", valeurs)

On conserve toutes les données. On peut les réutiliser autant qu’on veut.


Tu as découvert for avec range(). Mais la boucle for est faite pour parcourir toute séquence. Les listes en sont l’exemple le plus naturel.

prenoms = ["Alice", "Bob", "Charlie", "Diana"]
for prenom in prenoms:
print("Bonjour", prenom)
Bonjour Alice
Bonjour Bob
Bonjour Charlie
Bonjour Diana

À chaque itération, prenom prend la valeur de l’élément suivant de la liste. Pas besoin d’indice, pas besoin de range().

Parfois, tu as besoin de la position en plus de la valeur. Deux approches :

couleurs = ["rouge", "vert", "bleu"]
for i in range(len(couleurs)):
print(i, ":", couleurs[i])
0 : rouge
1 : vert
2 : bleu
couleurs = ["rouge", "vert", "bleu"]
for i, couleur in enumerate(couleurs):
print(i, ":", couleur)
0 : rouge
1 : vert
2 : bleu

Le patron accumulateur fonctionne aussi pour construire une liste :

carres = []
for i in range(1, 6):
carres.append(i ** 2)
print(carres)
[1, 4, 9, 16, 25]

On commence avec une liste vide, et on ajoute un élément à chaque itération.

Ces fonctions acceptent une liste en argument.

FonctionDescriptionExempleRésultat
len(liste)Nombre d’élémentslen([3, 1, 4])3
sum(liste)Somme des élémentssum([3, 1, 4])8
min(liste)Plus petit élémentmin([3, 1, 4])1
max(liste)Plus grand élémentmax([3, 1, 4])4
sorted(liste)Nouvelle liste triéesorted([3, 1, 4])[1, 3, 4]
list(range(5))Convertir en listelist(range(5))[0, 1, 2, 3, 4]

Les méthodes s’appellent avec la notation pointée : liste.methode().

MéthodeDescriptionModifie la liste ?
liste.append(x)Ajoute x à la finOui
liste.insert(i, x)Insère x à la position iOui
liste.extend(autre)Ajoute les éléments de autreOui
liste.remove(x)Retire la première occurrence de xOui
liste.pop()Retire et retourne le dernier élémentOui
liste.pop(i)Retire et retourne l’élément à l’indice iOui
liste.sort()Trie la liste en ordre croissantOui
liste.reverse()Inverse l’ordre des élémentsOui
liste.index(x)Retourne l’indice de la première occurrence de xNon
liste.count(x)Compte le nombre d’occurrences de xNon
liste.clear()Vide la listeOui
liste.copy()Retourne une copie de la listeNon
notes = [78, 92, 85, 78, 95]
print("Indice de 85 :", notes.index(85))
print("Occurrences de 78 :", notes.count(78))
notes.sort()
print("Triée :", notes)
notes.reverse()
print("Inversée :", notes)
Indice de 85 : 2
Occurrences de 78 : 2
Triée : [78, 78, 85, 92, 95]
Inversée : [95, 92, 85, 78, 78]

Un programme complet qui utilise la plupart des concepts vus :

# Saisie des notes d'un groupe
notes = []
nombre = int(input("Combien d'étudiants ? "))
for i in range(nombre):
note = float(input(format("Note de l'étudiant {} : ", i + 1)))
notes.append(note)
# Statistiques
moyenne = sum(notes) / len(notes)
meilleure = max(notes)
pire = min(notes)
reussites = 0
for note in notes:
if note >= 60:
reussites = reussites + 1
taux = reussites / len(notes) * 100
# Affichage
print()
print("=== Rapport du groupe ===")
print("Nombre d'étudiants :", len(notes))
print("Moyenne du groupe :", format(moyenne, ".1f"))
print("Note la plus haute :", meilleure)
print("Note la plus basse :", pire)
print("Taux de réussite :", format(taux, ".1f"), "%")
print("Notes triées :", sorted(notes))
Résultat de l’exécution (exemple avec 4 étudiants)
Section intitulée « Résultat de l’exécution (exemple avec 4 étudiants) »
Combien d'étudiants ? 4
Note de l'étudiant 1 : 85
Note de l'étudiant 2 : 72
Note de l'étudiant 3 : 58
Note de l'étudiant 4 : 91
=== Rapport du groupe ===
Nombre d'étudiants : 4
Moyenne du groupe : 76.5
Note la plus haute : 91.0
Note la plus basse : 58.0
Taux de réussite : 75.0 %
Notes triées : [58.0, 72.0, 85.0, 91.0]

Python offre une syntaxe condensée pour créer des listes à partir d’autres séquences : les compréhensions de listes (list comprehensions).

nouvelle_liste = [expression for variable in sequence]

Cela remplace le patron « liste vide + boucle + append » :

carres = []
for i in range(1, 6):
carres.append(i ** 2)

Les deux produisent [1, 4, 9, 16, 25].

nombres = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
pairs = [n for n in nombres if n % 2 == 0]
print(pairs)
[2, 4, 6, 8, 10]
# Températures Celsius vers Fahrenheit
celsius = [0, 10, 20, 30, 40]
fahrenheit = [c * 9 / 5 + 32 for c in celsius]
print(fahrenheit)
# Noms en majuscules
noms = ["alice", "bob", "charlie"]
majuscules = [nom.upper() for nom in noms]
print(majuscules)
# Notes au-dessus de 60
notes = [45, 82, 67, 55, 91, 73, 48]
reussites = [n for n in notes if n >= 60]
print(reussites)
[32.0, 50.0, 68.0, 86.0, 104.0]
['ALICE', 'BOB', 'CHARLIE']
[82, 67, 91, 73]

Un tuple est semblable à une liste, mais il est non modifiable (immutable). On utilise des parenthèses () au lieu des crochets [].

# Liste — modifiable
couleurs_liste = ["rouge", "vert", "bleu"]
couleurs_liste[0] = "jaune" # OK
# Tuple — non modifiable
couleurs_tuple = ("rouge", "vert", "bleu")
couleurs_tuple[0] = "jaune" # TypeError !
  1. Collection fixe qui ne doit pas être modifiée
  2. Coordonnées (x, y), date (jour, mois, annee)
  3. Retourner plusieurs valeurs depuis une fonction
# Coordonnées
point = (3, 7)
print("x :", point[0])
print("y :", point[1])
# Déballage (unpacking)
x, y = point
print("x :", x, "— y :", y)
x : 3
y : 7
x : 3 — y : 7

ConceptCe qu’il faut retenir
Création[] ou list() — taille dynamique
IndexationCommence à 0, indices négatifs depuis la fin
Tranchageliste[debut:fin] — borne de fin exclue
Parcoursfor element in liste — le plus naturel
Copieliste[:] ou list(liste) — pas b = a
Méthodesappend, insert, remove, pop, sort, reverse modifient la liste
Fonctionslen, sum, min, max, sorted ne modifient pas la liste