4.2. Les listes

Les listes sont des structures de données qui permettent de stocker plusieurs valeurs dans un ordre précis.

4.2.1. Déclaration de liste

On déclare une liste de la manière suivante : list_name = [value1, value2, ...]. Contrairement à d’autres langages de programmation, Python autorise les listes mixtes, c’est-à-dire qu’elles peuvent contenir plusieurs types de données mélangées. Ainsi, il est même possible de stocker des listes dans d’autres listes.

Voici quelques exemples de listes.

list1 = []                                     # liste vide
list2 = [1, "Alice", 27.6]                     # liste avec des éléments mixtes
list3 = ["Bob", 18.9, [1, "Alice", 27.06], 3]  # liste contenant une autre liste

4.2.2. Accéder aux éléments d’une liste

En Python, comme le veut la convention en informatique, on compte à partir du zéro. Ainsi, la position des éléments dans les listes, appelée indice, commence à zéro. Les éléments d’une liste de dix valeurs auront donc des indices allant de 0 à 9.

Pour accéder aux éléments d’une liste, il faut spécifier le nom de celle-ci suivi de l’indice correspondant entre crochets ([, ]). On peut aussi accéder à une plage d’éléments en spécifiant les indices de début (inclus) et de fin (exclu), séparés par le symbole : entre les crochets.

Note

Si aucun n’indice n’est indiqué avant :, la plage commencera au début de la liste (indice 0). De même, si aucun indice n’est indiqué après :, la plage se terminera à la fin de la liste.

fruits = ['fraise', 'banane', 'mangue', 'pomme', 'poire']  # on crée une liste

print(fruits)       # on affiche la liste entière
print(fruits[0])    # on affiche le 1er élément (indice 0)
print(fruits[1:3])  # on affiche les éléments d'indices 1 et 2
print(fruits[1:])   # on affiche les éléments à partir de l'indice 1
['fraise', 'banane', 'mangue', 'pomme', 'poire']
fraise
['banane', 'mangue']
['banane', 'mangue', 'pomme', 'poire']

En Python, on peut aussi accéder aux éléments d’une liste via des indices négatifs. Dans ce cas, l’indice -1 correspond au dernier élément de la liste, -2 à l’avant-dernier, etc. Cette notation est très utile pour accéder aux derniers éléments d’une liste lorsque l’on ne connaît pas sa longueur.

La figure 4.1 ci-dessous illustre les différentes manières d’accéder aux éléments d’une liste d’entiers via leur indice. La liste lst contient 10 éléments d’indices 0 à 9. Le premier élément est lst[0] alors que le dernier est lst[9], ou de manière équivalente lst[-1]. On peut également accéder à une plage d’éléments, par exemple lst[1:3].

Liste

Fig. 4.1 Liste.

Note

Il est possible d’accéder à des plages d’éléments non contigus d’une liste en spécifiant entre les crochets une troisième valeur qui indique la séparation entre deux indices successifs. Ainsi lst[1:6:2] désignera les éléments d’indices 1, 3 et 5 de la liste lst, alors que lst[::2] renverra tous les éléments aux positions paires. Cette troisième valeur peut également être négative, ce qui permet par exemple d’inverser une liste en écrivant lst[-1::-1] (ou même lst[::-1]).

4.2.3. Modifier un élément d’une liste

On modifie simplement les éléments d’une liste en y accédant via leur indice et en leur assignant une nouvelle valeur.

numbers = [8, 2, 3]
print(numbers)

numbers[0] = 1  # modification du 1er élément de la liste
print(numbers)
[8, 2, 3]
[1, 2, 3]

On peut aussi modifier une plage entière de valeurs.

vegetables = ['salade', 'mangue', 'pomme', 'poire', 'courgette']
print(vegetables)

vegetables[1:4] = ['poireau', 'concombre', 'carotte']  # modification d'une plage de valeurs
print(vegetables)
['salade', 'mangue', 'pomme', 'poire', 'courgette']
['salade', 'poireau', 'concombre', 'carotte', 'courgette']

4.2.4. Ajouter des éléments

Pour ajouter un élément à la fin d’une liste, on peut utiliser la fonction append(). Il s’agit plus précisément d’une méthodes en terminologie orientée objet (mais nous ignorerons cette distinction pour l’instant) que l’on applique sur la liste à modifier à l’aide de la notation pointée v.f(), où v désigne la variable et f() la function.

fruits = ['fraise', 'banane', 'mangue']

fruits.append('cassis')  # ajout d'un élément
print(fruits)
['fraise', 'banane', 'mangue', 'cassis']

4.2.5. Supprimer des éléments

Pour supprimer un élément d’une liste, on utilise la fonction pop(). Il faut indiquer entre les parenthèses l’indice de l’élément à supprimer, sinon pop() supprime le dernier élément de la liste.

fruits = ['fraise', 'banane', 'mangue']

fruits.pop(1)  # suppression du 2e élément
print(fruits)

fruits.pop()   # suppression du dernier élément
print(fruits)
['fraise', 'mangue']
['fraise']

4.2.6. Concaténation et réplication

Comme pour les chaînes de caractères, les opérateurs + et * permettent respectivement de concaténer et répliquer des listes.

fruits1 = ['fraise', 'banane']
fruits2 = ['pomme', 'poire']

print(fruits1 + fruits2)  # concaténation
print(fruits1 * 2)        # réplication
['fraise', 'banane', 'pomme', 'poire']
['fraise', 'banane', 'fraise', 'banane']

4.2.7. Longueur d’une liste

La fonction len() permet de connaître la longueur d’une liste, c’est-à-dire le nombre d’éléments qu’elle contient.

fruits = ['fraise', 'banane', 'mangue', 'pomme', 'poire']
print(len(fruits))  # on affiche le nombre d'éléments de la liste
5

4.2.8. Parcourir une liste

En Python, le mot réservé for (« pour ») permet, tout comme while, de répéter un bloc d’instructions. Ces deux instructions sont généralement interchangeables et peuvent donc être remplacées l’une par l’autre. Cependant, la syntaxe particulière de for est plus appropriée aux parcours de liste et autres types composés. En effet, une boucle for permet très simplement de répéter un bloc d’instructions pour chaque élément d’une liste en utilisant la syntaxe ci-dessous.

for _ in lst:
    instructions

Cela peut se traduire en français de la manière suivante :

  1. for : « pour chaque »

  2. _ : « élément » (nous y reviendrons)

  3. in : « dans »

  4. lst : « une liste donnée »

Ainsi, on pourra aisément parcourir chaque élément de la liste en exécutant une ou plusieurs instructions au passage.

for _ in [0, 1, 2, 3, 4]:  # liste de longueur 5 => la boucle s'exécute 5 fois
    print("Je suis affiché 5 fois")
Je suis affiché 5 fois
Je suis affiché 5 fois
Je suis affiché 5 fois
Je suis affiché 5 fois
Je suis affiché 5 fois

4.2.9. Les intervalles

La fonction range() permet de générer une liste (techniquement cela n’est pas vraiment une liste, mais un objet qui s’utilise de la même manière) correspondant à une série de valeurs entières consécutives, semblable à la liste de l’exemple ci-dessus. La série est constituée des nombres de 0 jusqu’à l’entier spécifié entre parenthèses (exclu). Ainsi, range(5) est équivalent à [0, 1, 2, 3, 4].

nb_lines = int(input("Combien de lignes afficher ? "))

for _ in range(nb_lines):
    print("Je suis affiché " + str(nb_lines) + " fois")
Combien de lignes afficher ? 3
Je suis affiché 3 fois
Je suis affiché 3 fois
Je suis affiché 3 fois

On peut aussi appeler la fonction avec deux paramètres : range(start, stop), ou avec trois paramètres : range(start, stop, step). Cela permet de spécifier une valeur initiale (start) différente de 0, ainsi que la valeur devant séparer deux éléments successifs de la liste (step). Ainsi, range(1, 6, 2) est équivalent à [1, 3, 5].

4.2.10. La variable d’itération

Lors de la présentation de la syntaxe de la boucle for, on a appelé élément le symbole _ (pour chaque élément dans une liste donnée). En réalité, ce symbole est utilisé comme remplacement de la variable d’itération de la boucle for, qui est une variable interne à la boucle (elle n’existe qu’à l’intérieur) prenant successivement la valeur de chaque élément de la liste que l’on traverse. On donnera un nom à cette variable d’itération lorsque l’on devra manipuler l’élément, et _ lorsque l’on n’a pas besoin d’y accéder.

languages = ['allemand', 'anglais', 'coréen', 'finnois']

for l in languages:                           # pour chaque langue dans la liste...
    print("Je parle couramment " + l + " !")  # on affiche cette langue
Je parle couramment allemand !
Je parle couramment anglais !
Je parle couramment coréen !
Je parle couramment finnois !

On peut comprendre ainsi cet exemple. Tout d’abord on crée une liste languages. Puis, pour chaque élément désigné par l dans la liste languages, on affiche l.

Nous pouvons bien entendu utiliser range() pour produire la liste à traverser.

for n in range(4):  # pour chaque nombre dans la liste créée par range(4)...
    print(n)        # on affiche ce nombre

for n in range(1984, 1987):  # avec 2 paramètres
    print(n)

for n in range(-1, -6, -2):  # avec 3 paramètres
    print(n)
0
1
2
3
1984
1985
1986
-1
-3
-5