Parcours de tableaux

D'après un cours de Nicolas Revéret

Un premier exemple

Considérons le tableau des dix langues les plus parlées dans le monde (en nombre de locuteurs dont c'est la langue maternelle - source : Wikipédia) :

🐍 Script Python
plus_parlees = [
    "mandarin",
    "espagnol",
    "anglais",
    "hindi",
    "bengali",
    "portugais",
    "russe",
    "japonais",
    "allemand",
    "cantonais",
]

Le mandarin est le premier élément du tableau : c'est la langue maternelle la plus importante. La valeur "mandarin" est à l'indice 0 dans le tableau.

Il est très courant de parcourir des tableaux en utilisant une boucle « Pour », avec for de Python.

Une première approche consiste à parcourir les indices

🐍 Script Python
print("Les dix langues maternelles les plus importantes sont :\n")
for indice in range(len(plus_parlees)):
    print("-", plus_parlees[indice])

On obtient alors :

📤 Sortie
Les dix langues maternelles les plus importantes sont :

- mandarin
- espagnol
- anglais
- hindi
- bengali
- portugais
- russe
- japonais
- allemand
- cantonais

Parcourir par valeurs

Il est toutefois possible de parcourir directement les valeurs contenues dans le tableau. Ainsi, le code ci-dessous affichera les mêmes lignes :

🐍 Script Python
print("Les dix langues maternelles les plus importantes sont :\n")
for langue in plus_parlees:
    print("-", langue)

Comme on peut le voir, le code est allégé, plus facile à lire, car on n'utilise pas les indices.

Les indices utiles ?

Dans certains cas, il est toutefois nécessaire d'utiliser les indices et les valeurs :

🐍 Script Python
print("Les dix langues maternelles les plus importantes sont :\n")
for indice in range(len(plus_parlees)):
    print("-", plus_parlees[indices], "en n°", indice + 1)

On obtient alors :

📤 Sortie
Les dix langues maternelles les plus importantes sont :

- mandarin en n° 1
- espagnol en n° 2
- anglais en n° 3
- hindi en n° 4
- bengali en n° 5
- portugais en n° 6
- russe en n° 7
- japonais en n° 8
- allemand en n° 9
- cantonais en n° 10
À vous de jouer 1

On considère le tableau pointures = [38, 43, 44, 43, 37, 42, 39, 43, 40]. On exécute le code ci-dessous :

🐍 Script Python
for i in range(44):
    print(pointures[i])
  • Ce code affiche tous les indices du tableau
  • Ce code affiche toutes les pointures du tableau
  • Ce code affiche les trois premières pointures du tableau
  • Ce code provoque une erreur
  • ❌ Ce code affiche tous les indices du tableau
  • ❌ Ce code affiche toutes les pointures du tableau
  • ❌ Ce code affiche les trois premières pointures du tableau
  • ✅ Ce code provoque une erreur

En effet, la boucle parcourt les entiers entre 0 inclus et 44 exclu. On essaie ensuite dans la ligne 2 d'accéder à l'élément d'indice i du tableau. Cela fonctionne pour les premières valeurs de i, jusqu'à i = 8. Ensuite, l'instruction pointures[i] entraîne une erreur car i vaut 9 et pointures[9] n'existe pas.

Remarques

Avec un tableau de longueur l, alors

  • tableau[l] n'existe pas,
  • tableau[l - 1] est le dernier élément, (si l > 0).
À vous de jouer 2

On considère toujours le tableau pointures = [38, 43, 44, 43, 37, 42, 39, 43, 40]. On exécute le code ci-dessous :

🐍 Script Python
for i in pointures:
    print(i)
  • Ce code affiche tous les indices du tableau
  • Ce code affiche toutes les pointures du tableau
  • Ce code provoque une erreur
  • La variable i est mal nommée
  • ❌ Ce code affiche tous les indices du tableau
  • ✅ Ce code affiche toutes les pointures du tableau
  • ❌ Ce code provoque une erreur
  • ✅ La variable i est mal nommée

Cette fois-ci on parcourt les valeurs du tableau. La première valeur de i est donc 38, la dernière 40. On affiche ensuite chaque valeur de i : des pointures.

De plus, le nom de variable i est souvent utilisé pour désigner des indices dans une boucle. Comme nous l'avons vu, la variable i se voit ici affectée les valeurs du tableau. Mieux vaudrait ne pas utiliser ce nom de variable.

Attention

Le nom de variable i est souvent utilisé pour désigner des indices. Il ne faut pas l'utiliser pour faire un parcours par valeurs d'un tableau, car cela crée de la confusion à la lecture du code. Pour un parcours par valeur, il vaut mieux choisir un nom de variable explicite.

Par exemple, comme vu au début de ce cours, la variable langue permet de parcourir le tableau plus_parlees grâce à :
for langue in plus_parlees:

À vous de jouer 3 : Parours par indice ou par valeur ?

On dispose d'un tableau contenant des nombres entiers dont certains sont peut-être en double. Dans quels cas de figures peut-on utiliser un parcours par valeurs du tableau (sans utiliser les indices) ?

  • Rechercher le plus grand nombre
  • Déterminer si le nombre 0 est présent dans le tableau ?
  • Déterminer la position du minimum
  • Calculer la somme de tous les nombres
  • ✅ Rechercher le plus grand nombre
  • ✅ Déterminer si le nombre 0 est présent dans le tableau ?
  • ❌ Déterminer la position du minimum
  • ✅ Calculer la somme de tous les nombres

Seul le troisième cas nécessite de connaître l'indice du minimum. Dans les autres cas, on peut se contenter de parcourir par valeurs.

À vous de jouer 4

Compléter le script ci-dessous permettant de compter le nombre de pointures égales à 41 dans le tableau.

L'avant-dernière ligne assert compteur == 2 permet de vérifier que votre code trouve bien 2.

  • Si ce n'est pas le cas Python affichera une erreur.
  • Si, à l'inverse, le test est passé avec succès Python affichera Bravo !.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Shift+Esc ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Solution

On peut se contenter de parcourir les valeurs :

🐍 Script Python
compteur = 0
for p in pointures:
    if p == 41:
        compteur += 1
À vous de jouer 5 : la fonction derniere_occurrence

Compléter la fonction derniere_occurrence prenant en argument tableau de type list ainsi qu'une valeur cible et qui renvoie l'indice de la dernière occurrence de cible dans tableau.

Si cible n'est pas dans tableau, la fonction renverra None.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Shift+Esc ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier

Solution

Sachant que l'on cherche la position d'un élément, il faut parcourir avec les indices :

🐍 Script Python
def derniere_occurrence(tableau, cible):
    resultat = None
    for i in range(len(tableau)):
        if tableau[i] == cible:
            resultat = i
    return resultat

Une solution alternative et plus astucieuse consiste à parcourir le tableau en partant de la fin. Ainsi, dès que l'on rencontre la cible on peut renvoyer l'indice correspondant :

🐍 Script Python
def derniere_occurrence(tableau, cible):
    for i in range(len(tableau) - 1, -1, -1):
        if tableau[i] == cible:
            return i
    return None