Parcours de dictionnaires⚓︎
Les différents parcours⚓︎
Parcours de dictionnaires
Puisque les valeurs ne sont pas ordonnées dans un dictionnaire, on ne peut pas les parcourir par indices, comme dans une liste.
On peut uniquement les parcourir clef par clef :
ages = {'Alice': 23, 'Bob': 32, 'Charlie': 56, 'Daniel': 10}
for nom in ages:
print(f"L'âge de {nom} est {ages[nom]}")
On obtient alors :
L'âge de Alice est 23
L'âge de Bob est 32
L'âge de Charlie est 56
L'âge de Daniel est 10
Dans les versions récentes de Python, le parcours se fait dans l'ordre d'insertion des clefs. Mais ce n'était pas le cas avant et si vous utilisez une ancienne version de Python, vous pouvez vous retrouver avec un autre ordre. Il vaut donc mieux ne pas s'attendre à un ordre particulier et partir du principe que l'ordre de parcours est arbitraire.
Rappel sur les f-strings
Pour faire un f-string, il faut rajouter un f
devant les guillemets ou apostrophes. Ensuite, il suffit de mettre entre accolade les expressions que l'ont veut Ă©valuer au moment de l'affichage.
>>> a = 5
>>> f"3 * {a} = {3*a}"
'3 * 5 = 15'
Parcours spécifiques
Python propose des méthodes spécifiques pour parcourir les dictionnaires. Pour cela on utilise dictionnaire.keys()
qui renvoie un itérable des clefs de dictionnaire
, dictionnaire.values()
qui renvoie un itérable des valeurs associées aux clefs et dictionnaire.items()
qui renvoie un itérable contenant les couples (clef, valeur)
.
>>> ages = {'Alice': 23, 'Bob': 32, 'Charlie': 56, 'Daniel': 10}
>>> ages.values()
dict_values([23, 32, 56, 10])
>>> ages.keys()
dict_keys(['Alice', 'Bob', 'Charlie', 'Daniel'])
>>> ages.items()
dict_items([('Alice', 23), ('Bob', 32), ('Charlie', 56), ('Daniel', 10)])
On obtient alors les parcours suivants :
ages = {'Alice': 23, 'Bob': 32, 'Charlie': 56, 'Daniel': 10}
for nom in ages.keys():
print(f"L'âge de {nom} est {ages[nom]}")
L'âge de Alice est 23
L'âge de Bob est 32
L'âge de Charlie est 56
L'âge de Daniel est 10
Cela revient Ă faire un parcours par clef.
ages = {'Alice': 23, 'Bob': 32, 'Charlie': 56, 'Daniel': 10}
for age in ages.values():
print(f"Quelqu'un a {age} ans")
Quelqu'un a 23 ans
Quelqu'un a 32 ans
Quelqu'un a 56 ans
Quelqu'un a 10 ans
On n'a pas d'information sur les clefs associées à ces valeurs.
ages = {'Alice': 23, 'Bob': 32, 'Charlie': 56, 'Daniel': 10}
for nom, age in ages.items():
print(f"L'âge de {nom} est {age}")
L'âge de Alice est 23
L'âge de Bob est 32
L'âge de Charlie est 56
L'âge de Daniel est 10
Exercices sur les ages⚓︎
Exercice 6
Écrire le code de la fonction combien_ont
qui prend en paramètres un entier age
et un dictionnaire dico_ages
et qui renvoie le nombre de clefs de dico_ages
sont associées à la valeur age
.
>>> ages1 = {'Alice': 23, 'Bob': 32, 'Charlie': 23, 'Daniel': 10}
>>> combien_ont(23, ages1)
2
>>> combien_ont(32, ages1)
1
>>> combien_ont(78, ages1)
0
>>> ages2 = {'Alice': 45, 'Bob': 45, 'Charlie': 45, 'Daniel': 45}
>>> combien_ont(45, ages2)
4
# Tests
(insensible Ă la casse)(Ctrl+I)
Exercice 7
Écrire le code de la fonction age_maximum
qui prend en paramètres un dictionnaire associant des noms avec des âges et qui renvoie le nom et l'âge de la personne la plus agée dans ce dictionnaire. On suppose que le dictionnaire n'est pas vide, qu'il n'y a pas deux personnes qui ont l'âge maximum et que tous les âges sont strictement supérieurs à 0.
>>> ages = {'Alice': 23, 'Bob': 32, 'Charlie': 56, 'Daniel': 10}
>>> age_maximum(ages)
('Charlie', 56)
Indice
Puisqu'il n'y a pas d'ordre particulier dans les clefs, on ne peut pas prendre la valeur associée à la première clef pour initialiser les valeurs. Par contre, on peut exploiter le fait que tous les âges sont supérieurs à 0 pour initialiser age_max
et plus_vieux
.
# Tests
(insensible Ă la casse)(Ctrl+I)
# Tests
(insensible Ă la casse)(Ctrl+I)
Analyse d'un livre⚓︎
Objectif de cette partie
Nous allons étudier le texte du livre Les Misérables de Victor Hugo.
Vous devez télécharger le fichier suivant et l'enregistrer dans le dossier où vous mettez vos fichiers Python :
Le texte a été obtenu grâce au site http://www.gutenberg.org
Vous devez aussi créer un nouveau fichier Python dans Thonny et y coller le programme suivant :
def occurrences(texte):
dico_occur = dict()
nouveau = ""
for s in texte: # On enlève tout ce qui n'est pas une lettre
if s in ",.;:/!?()«»_-'\"+*1234567890?°º\ufeff":
nouveau = nouveau + " " # On met un espace Ă la place
else:
nouveau = nouveau + s
for mot in nouveau.split(): # On coupe Ă chaque espace
mot = mot.lower()
if mot in dico_occur:
dico_occur[mot] += 1
else:
dico_occur[mot] = 1
return dico_occur
def occurrences_dans_fichier(fichier):
with open(fichier, 'r', encoding='utf8') as f:
dico = occurrences(f.read())
return dico
dico = occurrences_dans_fichier("LesMiserables.txt")
La fonction occurrence
prend en paramètre un texte, en extrait les mots et renvoie un dictionnaire comptant le nombre d'occurrences de tous ces mots.
La fonction occurrences_dans_fichier
prend en paramètre un texte correspondant au nom d'un fichier, l'ouvre et renvoie le dictionnaire du nombre d'occurrences de chacun des mots qu'il contient.
Enfin, le dictionnaire dico
créé à la fin du programme est le dictionnaire des occurrences des mots du livre Les Misérables.
Exercice 8
Déterminer le nombre de mots différents dans Les Misérables.
Solution
Il suffit de faire #python len(dico)
pour connaître le nombre de mots qu'il contient.
Exercice 9
Écrire une fonction mot_le_plus_frequent
qui prend en paramètre un dictionnaire dico
associant des mots à leur nombre d'occurrences, et qui renvoie le mot le plus fréquent dans le dictionnaire.
Solution
On peut utiliser exactement le mĂŞme algorithme que pour age_maximum
.
def mot_le_plus_frequent(dico):
maxi = 0
mot_record = ""
for mot in dico:
if dico[mot] > maxi:
maxi = dico[mot]
mot_record = mot
return mot_record
Exercice 10
Écrire une fonction le_plus_frequent
qui prend en paramètres un dictionnaire dico
d'occurrences de mots et un entier n
, et qui renvoie le mot de n
lettres le plus fréquent d'après le dictionnaire dico
. S'il n'y a pas de mot de longueur n
, renvoyez un texte vide.
Solution
Il suffit de rajouter un test dans la fonction précédente.
def le_plus_frequent(dico, n):
maxi = 0
mot_record = ""
for mot in dico:
if len(mot) == n and dico[mot] > maxi:
maxi = dico[mot]
mot_record = mot
return mot_record
Exercice 11
Écrire une fonction plus_frequents
qui prend en paramètre un dictionnaire d'occurrences de mots dico
et qui affiche les messages suivants, oĂą MOT
et NB
sont remplacés par les bonnes valeurs.
Vous déterminerez le nombre de lettres maximum à traiter.
>>> plus_frequents(dico)
1 lettre(s) : MOT avec NB occurrences
2 lettre(s) : MOT avec NB occurrences
3 lettre(s) : MOT avec NB occurrences
...
Solution
On peut mettre une taille maximum de 50 par sécurité.
def plus_frequents(dico):
for i in range(50):
mot = le_plus_frequent(dico, i)
if mot != "":
print(f"{i} lettre(s) : {mot} avec {dico[nb]} occurrences")
# Tests
(insensible Ă la casse)(Ctrl+I)