Aller au contenu

Boucles imbriquées⚓︎

Compter des lettres dans un mot⚓︎

En Python, les chaînes de caractères peuvent être parcourues comme les tableaux. Il est en particulier possible d'épeler un mot en parcourant les caractères de la chaîne :

🐍 Script Python
mot = "Insertion"
for lettre in mot:
    print(lettre)
Question

On considère le script ci-dessous :

🐍 Script Python
mot = "Insertion"
compteur = 0
for lettre in mot:
    if lettre == "i":
        compteur += 1

Que vaut compteur à l'issue de ce code ?

Solution

On parcourt les lettres de la chaîne mot. Pour chacune on vérifie si c'est un 'i'. Si c'est le cas, la variable est incrémentée. Comme il n'y a qu'un seul 'i' dans mot (la casse est importante), compteur vaut 1 à l'issue du code.

Compter des lettres dans une phrase⚓︎

Considérons désormais le problème suivant : nous avons réussi à récupérer l'ensemble des mots d'un texte dans un tableau. Chaque élément du tableau est un mot, la ponctuation a été supprimée.

Par exemple, phrase = ["Cette", "page", "traite", "des", "boucles", "imbriquées"].

On souhaite compter le nombre de 't' présents dans la phrase initiale.

On peut donc :

  • initialiser une variable compteur,
  • lire chaque mot de phrase,
  • lire chaque lettre de chaque mot et vérifier si c'est un 't' ou non.
Compter les 't'

Compléter le script ci-dessous permettant de compter les 't' dans phrase.

###
phrase = ["Cette", "page", "traîte", "des", "boucles", "imbriquées"]bksl-nlbksl-nlcompteur = ...bksl-nl...bksl-nlbksl-nlprint(f"Votre script a compté {compteur} 't'")bksl-nl

On attend :

📤 Sortie
Votre script a compté 4 't'
Solution

On imbrique deux boucles « Pour » :

🐍 Script Python
compteur = 0
for mot in phrase:
    for lettre in mot:
        if lettre == 't':
            compteur += 1

Les températures au Puy de Sancy⚓︎

On fournit le tableau ci-dessous contenant le relevé des températures à 7 h du matin enregistrées au Puy de Sancy (département du Puy de Dôme) lors du mois de février 2022.

🐍 Script Python
fevrier = [
    [-1, 4, 1,  0, -1, -1, 0],
    [-2, 2, 3, -2, -5,  0, 3],
    [0,  4, 4,  5,  1,  1, 2],
    [0,  5, 3, -3, -3, -1, 0],
]

Les relevés sont regroupés en semaines : il y a 4 semaines contenant chacune 7 températures.

Compter les températures négatives dans le mois

Compléter le script ci-dessous permettant de compter les températures strictement négatives (il y en a 9).

###
fevrier = [bksl-nl [-1, 4, 1, 0, -1, -1, 0],bksl-nl [-2, 2, 3, -2, -5, 0, 3],bksl-nl [0, 4, 4, 5, 1, 1, 2],bksl-nl [0, 5, 3, -3, -3, -1, 0]bksl-nl]bksl-nlbksl-nlnbpy-undnegatives = 0bksl-nl...bksl-nlbksl-nlprint(f"Il y a {nbpy-undnegatives} températures strictement négatives")bksl-nlbksl-nl

Solution
🐍 Script Python
negatives = 0
for semaine in fevrier:
    for temperature in semaine:
        if temperature < 0:
            negatives += 1
Compter les températures négatives par semaine

On souhaite désormais compter le nombre de températures strictement négatives par semaine. Les résultats seront stockés dans un tableau effectifs contenant initialement quatre 0.

Compléter le script ci-dessous permettant de compter les températures strictement négatives par semaine.

###
fevrier = [bksl-nl [-1, 4, 1, 0, -1, -1, 0],bksl-nl [-2, 2, 3, -2, -5, 0, 3],bksl-nl [0, 4, 4, 5, 1, 1, 2],bksl-nl [0, 5, 3, -3, -3, -1, 0]bksl-nl]bksl-nlbksl-nleffectifs = [0] py-str 4bksl-nl...bksl-nlbksl-nlassert effectifs == [3, 3, 0, 3], "Erreur, réessayez !"bksl-nlprint("Bravo !")bksl-nlbksl-nl

Astuce

Il faut garder trace de l'indice de la semaine étudiée. Par contre, il ne sert à rien de garder trace de l'indice du jour.

Solution
🐍 Script Python
effectifs = [0] * 4
for i in range(len(fevrier)):
    semaine = fevrier[i]
    for temperature in semaine:
        if temperature < 0:
            effectifs[i] += 1

Compter les inversions⚓︎

Nous avons vu précédemment une méthode permettant de mélanger un tableau. Il est possible de mesurer le « désordre » d'un tableau en comptant ses inversions.

Une inversion est un couple d'indices i et j (i strictement inférieur à j) tel que tableau[i] est strictement supérieur à tableau[j].

Par exemple, le tableau [3, 8, 1] compte deux inversions : les couples d'indices (0, 2) et (1, 2).

Il est possible de compter les inversions dans un tableau en imbriquant deux boucles :

  • la boucle principale parcourt tous les indices i jusqu'à l'avant-dernier inclus,
  • la boucle imbriquée parcourt les indices allant de i + 1 jusqu'à la fin du tableau.

Au sein de ces deux boucles, on compare les valeurs des éléments correspondants.

La fonction inversions

Compléter la fonction inversions ci-dessous permettant de compter les inversions présentes dans tableau.

###
def inversions(tableau):bksl-nl ...bksl-nlbksl-nlbksl-nltableaupy-und1 = [3, 8, 1]bksl-nlassert inversions(tableaupy-und1) == 2, "Erreur avec tableaupy-und1"bksl-nlbksl-nltableaupy-und2 = [30, 10, 23, 18, 23, 27, 20, 15, 21, 26, 24, 30, 15, 19]bksl-nlassert inversions(tableaupy-und2) == 44, "Erreur avec tableaupy-und2"bksl-nlbksl-nlprint("Bravo !")bksl-nlbksl-nl

Solution
🐍 Script Python
def inversions(tableau):
    total = 0
    for i in range(len(tableau) - 1):
        for j in range(i, len(tableau)):
            if tableau[i] > tableau[j]:
                total += 1
    return total
La fonction plus_petits

Compléter la fonction plus_petits ci-dessous permettant de compter le nombre d'inversions concernant chaque élément, c'est à dire, le nombre de valeurs situées après cet élément et qui lui sont strictement inférieures.

Par exemple pour le tableau [3, 8, 1] on obtiendra [1, 1, 0] car :

  • 3 possède un seul élément qui lui est strictement inférieur à sa droite,
  • 8 possède un seul élément qui lui est strictement inférieur à sa droite,
  • 1 ne possède aucun élément qui lui est strictement inférieur à sa droite.

###
def pluspy-undpetits(tableau):bksl-nl n = len(tableau)bksl-nl bilan = [0] py-str nbksl-nl ...bksl-nlbksl-nlbksl-nltableaupy-und1 = [3, 8, 1]bksl-nlassert pluspy-undpetits(tableaupy-und1) == [1, 1, 0], "Erreur avec tableaupy-und1"bksl-nlbksl-nltableaupy-und2 = [30, 10, 23, 18, 23, 27, 20, 15, 21]bksl-nlassert pluspy-undpetits(tableaupy-und2) == [8, 0, 4, 1, 3, 3, 1, 0, 0], "Erreur avec tableaupy-und2"bksl-nlbksl-nlprint("Bravo !")bksl-nlbksl-nl

Solution
🐍 Script Python
def plus_petits(tableau):
    n = len(tableau)
    bilan = [0] * n
    for i in range(len(tableau) - 1):
        for j in range(i + 1, len(tableau)):
            if tableau[i] > tableau[j]:
                bilan[i] += 1
    return bilan