Compter avec un dictionnaire
Compter combien de fois chaque chose apparaît est un besoin très courant : dépouiller un vote, analyser un texte, faire des statistiques. Le dictionnaire est l'outil idéal : chaque clé a son propre compteur.
Le problème
Voici les votes d'une classe pour choisir la sortie de fin d'année :
votes est un tableau vaut ['zoo', 'musée', 'zoo', 'piscine', 'zoo', 'musée']
affiche longueur(votes) + ' votes exprimés'
Avec une variable par choix (nbZoo, nbMusee...), il faudrait connaître la liste des choix à l'avance. Avec un dictionnaire, les compteurs se créent tout seuls.
Un compteur par clé
Pour chaque vote, deux cas :
- le choix n'a jamais été vu : on crée sa clé avec la valeur 1 ;
- le choix a déjà été vu : on ajoute 1 à son compteur.
votes est un tableau vaut ['zoo', 'musée', 'zoo', 'piscine', 'zoo', 'musée']
decompte est un dictionnaire vaut [:]
bulletin est un texte
pour i de 0 à longueur(votes) - 1
bulletin vaut votes[i]
si contient(decompte, bulletin) alors
decompte[bulletin] vaut decompte[bulletin] + 1
sinon
decompte[bulletin] vaut 1
fin si
fin pour
affiche 'Zoo : ' + decompte['zoo'] + ' voix'
contient(decompte, bulletin) vérifie si la clé existe déjà. C'est indispensable : lire une clé qui n'existe pas provoquerait une erreur.
Question : Après avoir traité les votes ['a', 'b', 'a'], que vaut decompte['a'] ? — 2. « a » apparaît deux fois : sa clé est créée avec 1, puis augmentée à 2.
Afficher tous les résultats
cles(decompte) donne le tableau de toutes les clés. On le parcourt pour afficher chaque compteur :
votes est un tableau vaut ['zoo', 'musée', 'zoo', 'piscine', 'zoo', 'musée']
decompte est un dictionnaire vaut [:]
bulletin est un texte
pour i de 0 à longueur(votes) - 1
bulletin vaut votes[i]
si contient(decompte, bulletin) alors
decompte[bulletin] vaut decompte[bulletin] + 1
sinon
decompte[bulletin] vaut 1
fin si
fin pour
choixPossibles est un tableau
choixPossibles vaut cles(decompte)
gagnant est un texte vaut choixPossibles[0]
option est un texte
pour i de 0 à longueur(choixPossibles) - 1
option vaut choixPossibles[i]
affiche option + ' : ' + repeter_texte('#', decompte[option])
si decompte[option] > decompte[gagnant] alors
gagnant vaut option
fin si
fin pour
affiche 'Sortie choisie : ' + gagnant
Deux techniques en une boucle : repeter_texte dessine une petite barre pour chaque choix, et la recherche du maximum trouve le gagnant.
Compter les lettres d'un texte
La même méthode s'applique aux lettres d'une phrase. On parcourt le texte caractère par caractère :
phrase est un texte vaut 'un hibou sur un bambou'
frequence est un dictionnaire vaut [:]
lettre est un texte
pour i de 1 à longueur(phrase)
lettre vaut copier(phrase, i, 1)
si lettre <> ' ' alors
si contient(frequence, lettre) alors
frequence[lettre] vaut frequence[lettre] + 1
sinon
frequence[lettre] vaut 1
fin si
fin si
fin pour
alphabet est un tableau
alphabet vaut cles(frequence)
pour i de 0 à longueur(alphabet) - 1
affiche alphabet[i] + ' : ' + frequence[alphabet[i]]
fin pour
Les espaces sont ignorées grâce au test lettre <> ' '. Les lettres s'affichent dans l'ordre où elles sont apparues dans la phrase.
En français, la lettre la plus fréquente est le « e ». C'est en comptant les lettres qu'on a cassé les premiers codes secrets : la lettre la plus fréquente du message chiffré a de bonnes chances d'être un « e ».
En résumé
- Un dictionnaire peut servir de table de compteurs : une clé par chose à compter.
- Si la clé existe, on ajoute 1 ; sinon, on la crée avec 1.
contient(dico, clé) teste l'existence d'une clé avant de la lire.cles(dico) permet de parcourir tous les compteurs.