Partie 4 · Algorithmique et programmation · Chapitre 22
La notion de liste
Créer, parcourir et transformer une liste.
Jusqu’ici, une variable ne retenait qu’un seul nombre à la fois : chaque tour de boucle écrasait le précédent. Pour garder tous les termes d’une suite, toutes les notes d’une classe ou tous les résultats d’une simulation, il faut un objet capable de contenir plusieurs valeurs à la fois. C’est la liste, et c’est le dernier outil du programme.
Créer une liste
Définition : Liste
Une liste est une suite ordonnée de valeurs, écrite entre crochets et séparées par des virgules. Elle peut contenir autant d’éléments que l’on veut, et même aucun.
notes = [12, 7, 25, 3, 18]vide = []print(notes)Ce que le programme affiche
[12, 7, 25, 3, 18]Remarque : l’ordre compte
Une liste n’est pas un ensemble au sens mathématique : l’ordre des éléments fait partie de la liste, et une même valeur peut y figurer plusieurs fois. Les listes et sont différentes.
Accéder aux éléments : les indices
Propriété : Numérotation à partir de zéro
Les éléments d’une liste sont numérotés **à partir de **. Une liste de éléments a donc des indices allant de à . On accède à un élément par .
Un indice négatif compte depuis la fin : est le dernier élément.
Exemple
notes = [12, 7, 25, 3, 18]print(notes[0])print(notes[2])print(notes[-1])Ce que le programme affiche
12
25
18L’élément d’indice est le troisième de la liste : c’est le décalage à retenir. Écrire provoquerait une erreur, puisque le dernier indice valide est .
Longueur et modification
Définition : Les trois opérations de base
- donne le nombre d’éléments.
- remplace l’élément d’indice .
- ajoute une valeur à la fin de la liste.
Exemple
notes = [12, 7, 25, 3, 18]print(len(notes))notes[1] = 20print(notes)notes.append(9)print(notes)Ce que le programme affiche
5
[12, 20, 25, 3, 18]
[12, 20, 25, 3, 18, 9]Après l’ajout, la liste compte six éléments et vaut : la longueur suit automatiquement.
Remarque : une notation inhabituelle
s’écrit après la liste, avec un point : . C’est la seule notation de ce type au programme. Elle modifie la liste sur place et ne renvoie rien : écrire détruirait la liste en la remplaçant par .
Parcourir une liste
Il y a deux façons de parcourir une liste, et le choix entre les deux n’est pas une question de goût.
Méthode : parcourir par élément
La variable de boucle prend directement chaque valeur de la liste :
notes = [12, 7, 25, 3, 18]for note in notes: print(note)Ce que le programme affiche
12
7
25
3
18C’est la forme la plus lisible dès qu’on veut seulement lire les valeurs.
Méthode : parcourir par indice
La variable de boucle prend les indices, et l’on accède aux valeurs par :
notes = [12, 7, 25, 3, 18]for i in range(len(notes)): print(i, notes[i])Ce que le programme affiche
0 12
1 7
2 25
3 3
4 18C’est la forme obligatoire quand on a besoin de la position, ou quand on veut modifier la liste.
Remarque : un piège classique
On veut doubler toutes les valeurs. Le premier réflexe ne marche pas :
notes = [12, 7, 25]for note in notes: note = note * 2print(notes)Ce que le programme affiche
[12, 7, 25]La variable est une copie de la valeur : la modifier ne touche pas la liste. Pour modifier, il faut passer par l’indice :
notes = [12, 7, 25]for i in range(len(notes)): notes[i] = notes[i] * 2print(notes)Ce que le programme affiche
[24, 14, 50]Construire une liste
Trois façons de fabriquer une liste, de la plus explicite à la plus compacte.
Méthode : en extension
On écrit tous les éléments à la main, entre crochets : . C’est le plus simple, mais réservé aux petites listes.
Méthode : par ajouts successifs
On part d’une liste vide et on ajoute au fur et à mesure. C’est la méthode la plus courante, et la seule possible quand chaque élément dépend du précédent.
carres = []for i in range(1, 5): carres.append(i * i)print(carres)Ce que le programme affiche
[1, 4, 9, 16]Méthode : en compréhension
Python permet d’écrire la même construction en une seule ligne, très proche de la notation mathématique :
carres = [i * i for i in range(1, 5)]print(carres)Ce que le programme affiche
[1, 4, 9, 16]L’expression placée avant le décrit ce que l’on veut mettre dans la liste ; la partie qui suit dit sur quoi l’on boucle.
Calculer sur une liste
Propriété : Trois fonctions à connaître
- donne la somme des éléments.
- et donnent le plus grand et le plus petit.
- Combinée à , la somme donne la moyenne : .
Exemple
notes = [12, 7, 25, 3, 18]print(sum(notes))print(sum(notes) / len(notes))print(max(notes), min(notes))Ce que le programme affiche
65
13.0
25 3Méthode : trouver le maximum à la main
Les sujets demandent souvent de le programmer sans utiliser . Le principe : on prend le premier élément comme champion provisoire, puis on le remplace dès qu’on trouve mieux.
notes = [12, 7, 25, 3, 18]maxi = notes[0]for note in notes: if note > maxi: maxi = noteprint(maxi)Ce que le programme affiche
25L’initialisation à est essentielle : initialiser à donnerait un résultat faux pour une liste de valeurs toutes négatives.
Exemple : compter, puis calculer une fréquence
Combien de notes atteignent la moyenne de ?
notes = [12, 7, 25, 3, 18]compteur = 0for note in notes: if note >= 10: compteur = compteur + 1print(compteur)Ce que le programme affiche
3Deux applications au programme
Exemple : stocker les termes d’une suite
Pour la suite et , on garde tous les termes calculés au lieu de les écraser :
u = 2termes = [u]for i in range(5): u = 0.5 * u + 3 termes.append(u)print(termes)Ce que le programme affiche
[2, 4.0, 5.0, 5.5, 5.75, 5.875]La liste contient six termes, de à : le premier a été placé avant la boucle, les cinq autres y sont ajoutés. On lit au passage la convergence vers .
Exemple : fréquence dans un échantillon
On a relevé huit lancers d’un dé. Quelle est la fréquence de la face dans cet échantillon ?
lancers = [3, 6, 1, 6, 4, 6, 2, 5]effectif = 0for valeur in lancers: if valeur == 6: effectif = effectif + 1print(effectif / len(lancers))Ce que le programme affiche
0.375La fréquence observée vaut , loin de . Sur un échantillon de taille , un tel écart n’a rien d’étonnant : c’est exactement ce que quantifie l’inégalité de concentration du chapitre 19.
Exemple : une fonction qui travaille sur une liste
Une liste peut être un paramètre de fonction, comme n’importe quelle valeur :
def moyenne(liste): return sum(liste) / len(liste)print(moyenne([12, 7, 25, 3, 18]))Ce que le programme affiche
13.0Erreurs classiques à éviter
Croire que le premier élément a l’indice .
Les indices commencent à ****. Le premier élément est , et le dernier , ou plus simplement .
Boucler sur .
Le dernier indice valide est , et s’arrête déjà là. Le provoque une erreur d’indice hors des limites.
Modifier la variable de boucle pour changer la liste.
Écrire dans une boucle ne change rien : la variable est une copie de la valeur. Pour modifier, il faut passer par l’indice, avec .
Écrire .
modifie la liste sur place et ne renvoie rien : cette ligne remplacerait la liste par . On écrit simplement .
Oublier de créer la liste avant la boucle d’ajouts.
La ligne doit précéder la boucle. Placée dedans, elle viderait la liste à chaque tour, et il ne resterait qu’un seul élément.
Initialiser la recherche du maximum à .
On initialise avec le premier élément de la liste. Partir de donne un résultat faux dès que toutes les valeurs sont négatives.
Confondre et le dernier indice.
compte les éléments ; le dernier indice vaut un de moins. Pour cinq éléments, la longueur est et le dernier indice .
Utiliser une liste comme un ensemble mathématique.
Une liste est ordonnée et peut contenir des répétitions : , et sont trois listes différentes.
Et maintenant
Le cours est lu ? Vérifie qu’il est acquis : le QCM repère les trous, les exercices confirment en conditions réelles, les flashcards ancrent les formules.