Vidéo 22 : Listes

\(\newcommand{\ds}{\displaystyle}\) \(\newcommand{\Frac}{\ds\frac}\) \(\renewcommand{\r}{\mathbb{ R}}\) \(\newcommand{\C}{\mathbb{ C}}\) \(\newcommand{\n}{\mathbb{ N}}\) \(\newcommand{\z}{\mathbb{ Z}}\) \(\newcommand{\Q}{\mathbb{ Q}}\) \(\newcommand{\N}{\mathbb{ N}}\) \(\newcommand{\n}{\mathbb{ N}}\) \(\newcommand{\ol}{\overline}\) \(\newcommand{\abs}[1]{\left| \,{#1} \right|}\) \(\newcommand{\pv}{\;;\;}\) \(\newcommand{\ens}[1]{\left\{ {#1} \right\}}\) \(\newcommand{\mens}[1]{\setminus\left\{ {#1} \right\}}\) \(\newcommand{\Par}[1]{\left({#1}\right)}\)

Vidéo 22 : Listes

Notion de liste

En Python, une liste est une structure de données modifiable représentant une « succession » d’objets :

1
2
L = [2020, 42, 2038]
print(L)
3
[2020, 42, 2038]
  • Ligne 1 : L désigne une liste, formée de trois éléments. Une paire de crochets entoure les éléments de la liste et ces éléments sont séparés par des virgules.
  • Ligne 2 : La fonction print est le moyen le plus simple d’obtenir un affichage sommaire d’une liste L.

La liste est la structure couramment utilisée pour représenter des « listes » au sens usuel du terme, comme une liste de mots :

1
2
L = ["Printemps", "Été", "Automne", "Hiver"]
print(L)
3
['Printemps', 'Été', 'Automne', 'Hiver']

Les éléments d’une liste peuvent aussi être des expressions utilisant des variables :

1
2
3
x=4
L = [2020, 10 * x + 2, 2038]
print(L)
4
[2020, 42, 2038]

Les listes ci-dessus sont des listes dites littérales : elles sont définies en explicitant ses éléments dans le code-source, placés entre crochets, un par un et en les séparant par des virgules.

Indexation des éléments d’une liste

Une propriété fondamentale des listes est qu’on accède directement à chaque élément d’une liste par un indice entier. Les différents éléments de la liste sont indexés par les entiers 0, 1, 2, etc. jusqu’à la fin de la liste.

1
2
3
4
L = [2020, 42, 2038]
print(L[0])
print(L[1])
print(L[2])
5
6
7
2020
42
2038
  • Ligne 2 : les éléments de la liste sont indexés, en commençant par 0.
  • Lignes 2-4 : on peut accéder à chaque élément de la liste L par son indice entouré d’une paire de crochets.

Attention ! l’indexation commence à 0 et non à 1.

Si une liste contient \(n\) éléments, ses indices sont tous les entiers entre 0 et \(n-1\), bornes 0 et \(n-1\) incluses, par exemple, une liste de 4 éléments est indexée par les entiers 0, 1, 2 et 3. L’élément d’indice i de la liste L est l’objet L[i]. L’indice 0 correspond toujours au premier élément de la liste et l’indice \(n-1\) d’une liste L de longueur \(n\) correspond toujours au dernier élément de L.

Tenter d’accéder à un indice se référant à un élément hors de la liste déclenche une erreur de type IndexError :

1
2
L = [2020, 42, 2038]
print(L[3])
3
4
5
6
Traceback (most recent call last):
  File "liste_indice_impossible.py", line 2, in <module>
    print(L[3])
IndexError: list index out of range
  • Ligne 1 : les indices de la liste L sont : 0, 1 et 2
  • Ligne 2 : on essaye d’accéder à un indice de L qui n’existe pas

La tentative d’accès à un élément d’une liste par un indice entier impossible est appelé un débordement d’indice ou aussi dépassement d’indice.

Nombre d’éléments d’une liste

La fonction built-in len appliquée à une liste renvoie le nombre d’éléments de la liste :

1
2
3
t = [81, 12, 65, 31]
n = len(t)
print(n)
4
4
  • Ligne 2 : n est le nombre d’éléments de la liste t.

Une liste peut contenir un nombre quelconque d’éléments ; en particulier une liste peut contenir un seul élément et même aucun élément. La liste littérale [] ne contient aucun élément :

1
2
3
4
L= [42]
print(len(L))
L= []
print(len(L))
5
6
1
0
  • Ligne 1 : liste ayant un seul élément.
  • Ligne 3 : la liste vide de longueur nulle (ligne 6).

Opérations sur les éléments d’une liste

Les éléments d’une liste L sont de la forme L[i]. Cette notation peut être utilisée pour des opérations comme on le ferait avec des variables :

1
2
3
t = [5, 3, 25, 3]
x = t[0] * t[1] + t[2] *t[3]
print(x)
4
90

Dans une certaine mesure, on peut considérer une liste comme une suite ordonnée de variables.

Appartenance à une liste

L’opérateur in permet de tester l’appartenance d’un élément à une liste :

1
2
3
L = [65, 31, 9, 32, 81, 82, 46, 12]
print(75 in L)
print(81 in L)
4
5
False
True

L’opérateur in renvoie un booléen. Le mot in est un mot-clé du langage Python.

Pour tester l’appartenance de a à une liste L, Python parcourt toute la liste depuis le début (l’indice 0) et jusqu’à ce que l’élément a soit trouvé ou que la fin de L soit rencontrée. Cela signifie que le test d’appartenance, bien que tenant sur une seule instruction, peut être très coûteux si L est longue.

Non-appartenance à une liste

L’opérateur not in permet de tester la non-appartenance d’un élément à une liste :

1
2
3
L = [65, 31, 9, 32, 81, 82, 46, 12]
print(75 not in L)
print(81 not in L)
4
5
True
False

L’opérateur not in renvoie un booléen. L’expression a not in L a même valeur de vérité que not a in L :

1
2
3
L = [65, 31, 9, 32, 81, 82, 46, 12]
print(75 not in L)
print(not 75 in L)
4
5
True
True

Le test de non-appartenance est basé sur le même principe que le test d’appartenance : un parcours de la liste depuis son début et arrêt du parcours lorsque la réponse est connue.

Modifier les éléments d’une liste

C’est une propriété fondamentale des listes : il est possible d’en modifier les éléments. Pour cela :

  • on accède à l’élément par son indice
  • on modifie l’élément par affectation.

Voici un exemple

1
2
3
4
5
L = [65, 31, 9, 32, 81, 82, 46, 12]
print(L)

L[4] = 75
print(L)
6
7
[65, 31, 9, 32, 81, 82, 46, 12]
[65, 31, 9, 32, 75, 82, 46, 12]
  • Ligne 4 : modification d’un élément de la liste par affectation ;
  • Ligne 7 : comparer, la liste L a été modifiée.

Le fait de pouvoir modifier le contenu d’une liste se traduit en disant qu’une liste est un objet mutable. Si L est une liste, on peut non seulement changer ses éléments, mais lui en adjoindre, ou lui en supprimer et donc modifier le nombre d’éléments de la liste.

Comme pour une variable, on peut affecter ou réaffecter un élément d’une liste :

1
2
3
t = [5, 3, 25, 3]
t[0] = 10 * t[0]
print(t)
4
[50, 3, 25, 3]
  • Ligne 2 : réaffectation de l’élément t[0].