Le Cahier de Maths

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 [1, 2]\texttt{[1, 2]} et [2, 1]\texttt{[2, 1]} 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 00**. Une liste de nn éléments a donc des indices allant de 00 à n1n - 1. On accède à un élément par liste[i]\texttt{liste[i]}.

Un indice négatif compte depuis la fin : liste[-1]\texttt{liste[-1]} est le dernier élément.

notes = [12, 7, 25, 3, 18]127253180-51-42-33-24-1notes[2]
Les cinq éléments de la liste notes, avec en dessous leurs indices depuis le début, puis depuis la fin. L’élément d’indice 2 est le troisième de la liste.

Exemple

notes = [12, 7, 25, 3, 18]print(notes[0])print(notes[2])print(notes[-1])

Ce que le programme affiche

12
25
18

L’élément d’indice 22 est le troisième de la liste : c’est le décalage à retenir. Écrire notes[5]\texttt{notes[5]} provoquerait une erreur, puisque le dernier indice valide est 44.

Longueur et modification

Définition : Les trois opérations de base

  • len(liste)\texttt{len(liste)} donne le nombre d’éléments.
  • liste[i] = valeur\texttt{liste[i] = valeur} remplace l’élément d’indice ii.
  • liste.append(valeur)\texttt{liste.append(valeur)} 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 len(notes)\texttt{len(notes)} vaut 66 : la longueur suit automatiquement.

Remarque : une notation inhabituelle

append\texttt{append} s’écrit après la liste, avec un point : notes.append(9)\texttt{notes.append(9)}. C’est la seule notation de ce type au programme. Elle modifie la liste sur place et ne renvoie rien : écrire notes = notes.append(9)\texttt{notes = notes.append(9)} détruirait la liste en la remplaçant par None\texttt{None}.

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.

notes12725318notesens du parcours
Parcours d’une liste : à chaque tour, la variable de boucle désigne l’élément suivant, du premier jusqu’au dernier.

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
18

C’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[i]\texttt{notes[i]} :

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 18

C’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 note\texttt{note} 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 : notes = [12, 7, 25, 3, 18]\texttt{notes = [12, 7, 25, 3, 18]}. 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]
départ[ ]i = 11i = 214i = 3149i = 414916
Construction par ajouts successifs : la liste part vide, et chaque tour de boucle ajoute une case à la fin, en rouge.

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 {i21i4}\{i^2 \mid 1 \leqslant i \leqslant 4\} :

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 for\texttt{for} 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

  • sum(liste)\texttt{sum(liste)} donne la somme des éléments.
  • max(liste)\texttt{max(liste)} et min(liste)\texttt{min(liste)} donnent le plus grand et le plus petit.
  • Combinée à len\texttt{len}, la somme donne la moyenne : sum(liste) / len(liste)\texttt{sum(liste) / len(liste)}.

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 3

Méthode : trouver le maximum à la main

Les sujets demandent souvent de le programmer sans utiliser max\texttt{max}. 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

25

L’initialisation à notes[0]\texttt{notes[0]} est essentielle : initialiser à 00 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 1010 ?

notes = [12, 7, 25, 3, 18]compteur = 0for note in notes:    if note >= 10:        compteur = compteur + 1print(compteur)

Ce que le programme affiche

3

Deux applications au programme

Exemple : stocker les termes d’une suite

Pour la suite u0=2u_0 = 2 et un+1=0,5un+3u_{n+1} = 0{,}5\,u_n + 3, 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 u0u_0 à u5u_5 : le premier a été placé avant la boucle, les cinq autres y sont ajoutés. On lit au passage la convergence vers 66.

Exemple : fréquence dans un échantillon

On a relevé huit lancers d’un dé. Quelle est la fréquence de la face 66 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.375

La fréquence observée vaut 38=0,375\dfrac{3}{8} = 0{,}375, loin de 160,167\dfrac{1}{6} \approx 0{,}167. Sur un échantillon de taille 88, 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.0

Erreurs classiques à éviter

  • Croire que le premier élément a l’indice 11.

    Les indices commencent à **00**. Le premier élément est liste[0]\texttt{liste[0]}, et le dernier liste[len(liste) - 1]\texttt{liste[len(liste) - 1]}, ou plus simplement liste[-1]\texttt{liste[-1]}.

  • Boucler sur range(len(liste) + 1)\texttt{range(len(liste) + 1)}.

    Le dernier indice valide est len(liste) - 1\texttt{len(liste) - 1}, et range(len(liste))\texttt{range(len(liste))} s’arrête déjà là. Le +1+1 provoque une erreur d’indice hors des limites.

  • Modifier la variable de boucle pour changer la liste.

    Écrire note = note * 2\texttt{note = note * 2} dans une boucle for note in notes:\texttt{for note in notes:} ne change rien : la variable est une copie de la valeur. Pour modifier, il faut passer par l’indice, avec notes[i] = ...\texttt{notes[i] = ...}.

  • Écrire notes = notes.append(9)\texttt{notes = notes.append(9)}.

    append\texttt{append} modifie la liste sur place et ne renvoie rien : cette ligne remplacerait la liste par None\texttt{None}. On écrit simplement notes.append(9)\texttt{notes.append(9)}.

  • Oublier de créer la liste avant la boucle d’ajouts.

    La ligne carres = []\texttt{carres = []} 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 à 00.

    On initialise avec le premier élément de la liste. Partir de 00 donne un résultat faux dès que toutes les valeurs sont négatives.

  • Confondre len(liste)\texttt{len(liste)} et le dernier indice.

    len\texttt{len} compte les éléments ; le dernier indice vaut un de moins. Pour cinq éléments, la longueur est 55 et le dernier indice 44.

  • Utiliser une liste comme un ensemble mathématique.

    Une liste est ordonnée et peut contenir des répétitions : [1, 2]\texttt{[1, 2]}, [2, 1]\texttt{[2, 1]} et [1, 1, 2]\texttt{[1, 1, 2]} 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.