Aller au contenu

Parcours de tableaux⚓︎

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

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.

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
Question

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

🐍 Script Python
1
2
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... avant d'afficher une erreur !
  • ❌ 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).
Question

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
1
2
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.

Question

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.

Question

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 !.

###
pointures = [43, 39, 43, 41, 44, 37, 39, 43, 38, 37, 39, 39, 41, 43, 44]bksl-nlbksl-nlcompteur = ...bksl-nlfor ... in ...:bksl-nl if ... == 41:bksl-nl ... = ...bksl-nlbksl-nl# Testsbksl-nlassert compteur == 2, "Le compteur devrait valoir 2"bksl-nlprint("Bravo !")bksl-nlbksl-nl

Solution

On peut se contenter de parcourir les valeurs :

🐍 Script Python
compteur = 0
for p in pointures:
    if p == 41:
        compteur += 1
Question : 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.

###
def dernierepy-undoccurrence(tableau, cible):bksl-nl ...bksl-nlbksl-nlbksl-nlnombres = [3, 8, 5, 4, 3, 8]bksl-nlbksl-nl# Testsbksl-nlassert dernierepy-undoccurrence(nombres, 3) == 4, "Erreur en cherchant 3"bksl-nlassert dernierepy-undoccurrence(nombres, 8) == 5, "Erreur en cherchant 8"bksl-nlassert dernierepy-undoccurrence(nombres, 5) == 2, "Erreur en cherchant 5"bksl-nlassert dernierepy-undoccurrence(nombres, 0) is None, "Erreur en cherchant 0"bksl-nlprint("Bravo !")bksl-nlbksl-nl

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