Chapitre 4 : Listes

         1 – Définition

    Une liste est une structure de données qui contient une série de valeurs. Python autorise la construction de liste contenant des valeurs de type différent (par exemple entier et chaîne de caractères), ce qui leur confère une grande flexibilité. Une liste est déclarée par une série de valeurs (ne pas oublier les guillemets, simples ou doubles, s’il s’agit de chaînes de caractères) séparées par des virgules, et le tout encadré par des crochets. En voici quelques exemples :

Code python

>>> animaux = [‘girafe’,’tigre’,’singe’,’souris’]
>>> tailles = [5, 2.5, 1.75, 0.15]
>>> mixte = [‘girafe’, 5, ‘souris’, 0.15]
>>> animaux
[‘girafe’, ‘tigre’, ‘singe’, ‘souris’]
>>> tailles
[5, 2.5, 1.75, 0.15]
>>> mixte
[‘girafe’, 5, ‘souris’, 0.15]
Lorsque l’on affiche une liste, Python la restitue telle qu’elle a été saisie.

         2 – Utilisation

    Un des gros avantages d’une liste est que vous pouvez appeler ses éléments par leur position. Ce numéro est appelé indice (ou index) de la liste.

liste : [‘girafe’, ‘tigre’, ‘singe’, ‘souris’]
indice : 0 1 2 3
Soyez très attentifs au fait que les indices d’une liste de n éléments commence à 0 et se termine à n-1. Voyez l’exemple suivant :

Code python

>>> animaux = [‘girafe’,’tigre’,’singe’,’souris’]
>>> animaux[0]
‘girafe’
>>> animaux[1]
‘tigre’
>>> animaux[3]
‘souris’
Par conséquent, si on appelle l’élément d’indice 4 de notre liste, Python renverra un message d’erreur :

Code python

>>> animaux[4]
Traceback (innermost last):
File « <stdin> », line 1, in ?
IndexError: list index out of range
N’oubliez pas ceci ou vous risqueriez d’obtenir des bugs inattendus !

         3 – Opération sur les listes

    Tout comme les chaînes de caractères, les listes supportent l’opérateur + de concaténation, ainsi que l’opérateur * pour la duplication :

Code python

>>> ani1 = [‘girafe’,’tigre’]
>>> ani2 = [‘singe’,’souris’]
>>> ani1 + ani2
[‘girafe’, ‘tigre’, ‘singe’, ‘souris’]
>>> ani1 * 3
[‘girafe’, ‘tigre’, ‘girafe’, ‘tigre’, ‘girafe’, ‘tigre’]

         4 – Indiçage négatif et tranches

    La liste peut également être indexée avec des nombres négatifs selon le modèle suivant :

Code python

liste : [‘girafe’, ‘tigre’, ‘singe’, ‘souris’]
indice positif : 0 1 2 3
indice négatif : -4 -3 -2 -1
ou encore :
liste : [‘A’,’C’,’D’,’E’,’F’,’G’,’H’,’I’,’K’,’L’]
indice positif : 0 1 2 3 4 5 6 7 8 9
indice negatif : -10 -9 -8 -7 -6 -5 -4 -3 – 2 -1
Les indices négatifs reviennent à compter à partir de la fin. Leur principal avantage est que vous pouvez appeler le dernier élément d’une liste à l’aide de l’indice -1 sans pour autant connaître la longueur de la liste.

Code python

>>> animaux = [‘girafe’,’tigre’,’singe’,’souris’]
>>> animaux[-4]
‘girafe’
>>> animaux[-2]
‘singe’
>>> animaux[-1]
‘souris’
Un autre avantage des listes est la possibilité de sélectionner une partie en utilisant un indiçage construit sur le modèle [m:n+1] pour récupérer tous les éléments, du émième au énième (de l’élément m inclus à l’élément n+1 exclus). On dit alors qu’on récupère une tranche de la liste, par exemple :

Code python

>>> animaux = [‘girafe’, ‘tigre’, ‘singe’, ‘souris’]
>>> animaux[0:2]
[‘girafe’, ‘tigre’]
>>> animaux[0:3]
[‘girafe’, ‘tigre’, ‘singe’]
>>> animaux[0:]
[‘girafe’, ‘tigre’, ‘singe’, ‘souris’]
>>> animaux[:]
[‘girafe’, ‘tigre’, ‘singe’, ‘souris’]
>>> animaux[1:]
[‘tigre’, ‘singe’, ‘souris’]
>>> animaux[1:-1]
[‘tigre’, ‘singe’]
Remarquez que lorsqu’aucun indice n’est indiqué à gauche ou à droite du symbole : , Python prend par défaut tous les éléments depuis le début ou tous les éléments jusqu’à la fin respectivement.

Dans les versions récentes de Python, on peut aussi préciser le pas en ajoutant un : supplémentaire et en indiquant le pas par un entier.

Code python

>>> animaux = [‘girafe’, ‘tigre’, ‘singe’, ‘souris’]
>>> animaux[0:3:2]
[‘girafe’, ‘singe’]
>>> x = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> x
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> x[::1]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> x[::2]
[0, 2, 4, 6, 8]
>>> x[::3]
[0, 3, 6, 9]
>>> x[1:6:3]
[1, 4]
Finalement, on voit que l’accès au contenu d’une liste avec des crochets fonctionne sur le modèle liste[début:fin as].

         5 – Fonctions range et len

    L’instruction range() vous permet de créer des listes d’entiers (et d’entiers uniquement) de manière simple et rapide. Voyez plutôt :

Code python

>>> range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> range(0,5)
[0, 1, 2, 3, 4]
>>> range(15,20)
[15, 16, 17, 18, 19]
>>> range(0,1000,200)
[0, 200, 400, 600, 800]
>>> range(2,-2,-1)
[2, 1, 0, -1]
L’instruction range() fonctionne sur le modèle range([début,] fin[, pas]). Les arguments entre crochets sont optionnels.

L’instruction len() vous permet de connaître la longueur d’une liste, ce qui parfois est bien pratique lorsqu’on lit un fichier par exemple, et que l’on ne connaît pas a priori la longueur des lignes. Voici un exemple d’utilisation :

Code python

>>> animaux = [‘girafe’, ‘tigre’, ‘singe’, ‘souris’]
>>> len(animaux)
4
>>> len(range(10))
10

         6 – Listes de listes

    Pour finir, sachez qu’il est tout-à-fait possible de construire des listes de listes. Cette fonctionnalité peut être parfois très pratique. Par exemple :

Code python

>>> enclos1 = [‘girafe’, 4]
>>> enclos2 = [‘tigre’, 2]
>>> enclos3 = [‘singe’, 5]
>>> zoo = [enclos1, enclos2, enclos3]
>>> zoo
[[‘girafe’, 4], [‘tigre’, 2], [‘singe’, 5]]
Dans cet exemple, chaque sous-liste contient une catégorie d’animal et le nombre d’animaux pour chaque catégorie. Pour accéder à un élément de la sous-liste, on utilise un double indiçage.

Code python

>>> zoo[1]
[‘tigre’, 2]
>>> zoo[1][0]
‘tigre’
>>> zoo[1][1]
2
On verra un peu plus loin qu’il existe en Python les dictionnaires qui sont très pratiques pour faire ce genre de choses. On verra aussi qu’il existe un module nommé numpy permettant de gérer des listes ou tableaux de nombres (vecteurs et matrices), ainsi que de faire des opérations dessus.

         7 – Exercices

    Conseil : utilisez l’interpréteur Python.

Constituez une liste semaine contenant les 7 jours de la semaine. À partir de cette liste, comment récupérez-vous seulement les 5 premiers jours de la semaine d’une part, et ceux du week-end d’autre part (utilisez pour cela l’indiçage) ? Cherchez un autre moyen pour arriver au même résultat (en utilisant un autre indiçage).
Trouvez deux manières pour accéder au dernier jour de la semaine.
Inversez les jours de la semaine en une commande.
Créez 4 listes hiver, printemps, ete et automne contenant les mois correspondant à ces saisons. Créez ensuite une liste saisons contenant les sous-listes hiver, printemps,ete et automne. Prévoyez ce que valent les variables suivantes, puis vérifiez-le dans l’interpréteur :
saisons[2]
saisons[1][0]
saisons[1:2]
saisons[:][1]
Comment expliquez-vous ce dernier résultat ?
Affichez la table des 9 en une seule commande avec l’instruction range().
Avec Python, répondez à la question suivante en une seule commande. Combien y a-t-il de nombres pairs dans l’intervalle [2 , 10000] inclus ?