13: Listes (tableaux)

Une liste est une séquence de plusieurs variables groupées ensemble sous un seul nom. Au lieu d'écrire un programme avec plusieurs variables x0, x1, x2, … vous pouvez définir une seule variable x et accéder à ces éléments x[0], x[1], x[2], etc. Plus important encore, vous pouvez mettre d'autres expressions et variables à l'intérieur des [crochets], par exemple x[i] and x[i+1]. Cela permet de gérer des groupes de données assez large en utilisant peu de code.

Une manière de créer une liste est d'encadrer plusieurs valeurs par des crochets et de les séparer par des virgules:

maListe = ["la première valeur dans la liste", 1999, 4.5]
Ceci crée une liste maListe de taille 3. Chaque élément de la liste se voit attribuer un nombre appelé index: le premier élément a pour index 0, le suivant a pour index 1 et ainsi de suite. Les variables individuelles qui composent la liste ont les noms

«nomDeLaListe»[«numeroIndex»]

Donc dans cet exemple, maListe[0] est une variable donc la valeur est la chaîne "la première valeur dans la liste" et print(maListe[2]) affiche 4.5. Vous pouvez aussi changer les valeurs des éléments de la liste et afficher la liste entière:

Exemple
Modifier et afficher une liste.

Comme vous pouvez le voir, l'élément numbers[0] est traité comme s'il était lui-même une variable: il a une valeur et peut être changé.

Exercice à choix multiple : Meta-Truc
Quelle est la sortie du code suivant?

truc = [2, 25, 80, 12]
truc[truc[0]] = truc[3]
print(truc)
Correct! Regardez l'instruction d'affectation (la 2e ligne). La valeur de truc[3] sur le côté droit est 12. Pour le côté gauche, truc[0] est 2, donc truc[truc[0]] se réfère à la variable truc[2]. La valeur de cette variable est mis à jour (à partir de 80) à 12.

Ce que Python appelle une liste serait appelé un tableau (array en anglais) dans la pluspart des langages de programmation. Python a aussi quelque chose de different & plus avancé appelé tableau.

Un erreur courante

Si vous demandez à Python d'utiliser un index qui n'existe pas, vous obtiendrez une erreur:

Exemple
Erreur "out-of-range".

Dans cet exemple, puisque maListe a une longueur de 4 et que le premier index est 0, l'index maximum est 3. Demander un index de 4, 5 ou quelque chose de plus grand génère une erreur.

Opérations courantes utiles

Longueur d'une liste: len(«liste»)

Pour déterminer le nombre d'éléments dans une liste, appelez la fonction len() sur cette liste. Regardez comment range est utilisé dans l'exemple suivant.

Exemple
Obtenir la longueur d'une liste et l'utiliser pour parcourir la liste.

Il est courant d'utiliser len pour écrire du code qui fonctionne sur des listes de n'importe quelle longueur comme dans l'exemple ci-dessus et l'exercice suivant.

Exercice de code : Le singe au milieu
Ecrire une fonction milieu(L) qui prend une liste L comme argument et retourne l'élément qui se trouve au milieu de L. (Pour s'assurer que le milieu est bien défini, vous assumerez que L est de longueur impaire.) Par exemple, appeler milieu([8, 0, 100, 12, 1]) donnera 100 puisque c'est la valeur qui est positionnée exactement au milieu de la liste.
Entrez instructions de test comme print(mafonction("argument de test")) ci-dessous.

Est-ce que les listes sont comme des chaînes?

Vous avez surement déjà remarqué que les opérations sur les listes ressemblent beaucoup à celle des chaînes: dans les deux cas on peut utiliser la fonction len() pour obtenir leurs longueurs et les deux utilisent X[«index»] pour extraire des éléments individuels. Les listes et les chaînes sont toutes les deux liées: elles sont de "types séquence" en Python. La différence majeure est que les caractères d'une chaîne ne peuvent pas être changés.

Exemple
Erreur générée en essayant d'attribuer une valeur à un caractère d'une chaîne.

Pour cette raison on dit que les listes sont de type mutable et que les chaînes sont de type immutable; vous verrez un peu plus d'information à ce sujet à la leçon 17.

Concaténation et création

A la leçon 7A concernant le type str, vous vous rappellerez qu'il est possible d'utiliser + pour accoler (concaténer) deux chaînes ensemble. Vous pouvez faire de même avec des listes:

Exemple
Combiner des listes avec +.

De même, vous pouvez utiliser le symbole * pour étendre une liste par répétition. Ceci est utile pour créer une nouvelle liste de taille voulue.

Exemple
Comment utiliser *.

Pour résoudre cet exercice, utilisez un des opérateurs que nous venons d'introduire et une boucle for.

Exercice de code : C'est naturel
Ecrivez une fonction nombresNaturels qui prend un entier positif n comme entrée et retourne une liste [1, 2, ...], composée des n premiers entiers naturels.
Entrez instructions de test comme print(mafonction("argument de test")) ci-dessous.

Fin de ligne: indices négatifs

Pour obtenir le dernier élément d'une liste, on utilise

«listName»[-1]

Plus généralement, L[-k] retourne le kème élément depuis la fin de la liste; Python gère cela intérieurement en le traduisant en L[len(L)-k]. Ce raccour‎ci fonctionne pour les chaînes également!

Exercice de code : Palindrome
Un palindrome est un mot qui s'écrit de la même façon à l'endroit et à l'envers. Par exemple le mot

ressasser

est un palindrome: la première et la dernière lettres sont les mêmes (r), la deuxième et l'avant dernière également (e), etc. Ecrivez une fonction estPalindrome(S) qui prend une chaîne S comme entrée et retourne True si la chaîne est un palindrome etFalse autrement.

Entrez instructions de test comme print(mafonction("argument de test")) ci-dessous.

max et sum

La fonction max que nous avons déjà vue s'applique également aux listes de nombres: elle retourne le plus grand nombre dans une liste. De même, la fonction sum(L) retourne la somme des éléments de la liste L.

Exemple

Exercice de code : Produit
Définir une fonction prod(L) qui retourne le produit des éléments d'une liste L.
Entrez instructions de test comme print(mafonction("argument de test")) ci-dessous.

Listes et boucles

Il est très courant (comme dans l'exercice précédent) de parcourir une liste pour obtenir chacune de ses valeurs. Python propose un raccourci pour faire ce type d'opération appelé boucle "for all" ou boucle "for each". Si L est une liste, le code

for x in L:
  «corps de la boucle»
fonctionne de la manière suivante: d'abord x prend la première valeur de L et le corps est exécuté; ensuite x prend la seconde valeur de L et le code est exécuté; ceci continue pour tous les éléments de L.

Exercice de code : for in
Définissez une fonction prod(L) comme avant mais cette fois en utilisant ce nouveau type de boucle.
Entrez instructions de test comme print(mafonction("argument de test")) ci-dessous.

Les boucles "for all" fonctionnent également pour les chaînes: essayez for char in "hello".

Bravo! Vous pouvez passer à la leçon suivante ou essayer les exercices bonus ci-dessous.


Exercice à réponse courte : Fonction mystère
Quelle valeur de x aura pour effet que que la fonction mystery(x) s'exécutera infiniment?

def mystery(x):
  a = [0, 4, 0, 3, 2]
  while x > 0:
    x = a[x]
  return "Fini"
Correct !

Exercice mêlé : à la Mode
Le mode d'une liste est l'élément qui apparaît le plus souvent (celui qui apparaît le plus grand nombre de fois). Déchiffrez le programme ci-dessous afin que mode(L) trouve correctement le mode en assumant que L est une liste de nombre de 0 à 9. (Pour simplifier l'exercice, il ne pourra y avoir qu'une mode.)
  • return i
  • for i in L:
  • fréquence[i] = fréquence[i] + 1
  • if fréquence[i]==max(fréquence):
  • fréquence = [0]*10
  • def mode(L):
  • for i in range(0, 10):