Dictionnaires
Consignes
Dans ce TP, les différents exercices sont indépendants.
Enregistrez chaque fichier dans le dossier [Dictionnaires] sous le nom donné à l'exercice : dictionnaire.py
, titanic.py
, scrabble.py
, occurence.py
...
Exercice n°1 : Dictionnaire Français / Anglais
On souhaite réaliser un dictionnaire Français / Anglais, afin que l'utilisateur demande un mot en français et l'ordinateur répond par la traduction anglaise du mot.
Le dictionnaire Python contiendra donc des paires de clé/valeur définies telles que :
La clé est un mot en français.
La valeur est la traduction anglaise du mot associé à sa clé.
Question
Créer un dictionnaire
dico_fr_en
de 10 éléments permettant cette traduction.Rédiger une fonction
traduction()
qui prend comme argument le terme français et renvoie le terme anglais.Enrichir le programme avec une question à l'utilisateur pour connaître le mot à traduire. Le programme doit afficher l'ensemble des mots français disponibles.
Indice
Question 1 : Pour créer ce dictionnaire, il faut utiliser la syntaxe vue en cours :
dico_fr_en = {
"bonjour": "hello",
"ordinateur": "computer",
...
}
Indice
Question 2 : Le terme français est utilisé en tant que clé, il faut donc vérifier que cette clé existe avant de la réupérer.
Indice
Question 3 : On doit utiliser la fonction input()
pour demander un mot à l'utilisateur. Pour consulter l'ensemble des mots disponibles, on devra parcourir le dictionnaire.
Solution
dico_fr_en = {
"bonjour": "hello",
"ordinateur": "computer",
"lycée": "high school",
"au-revoir": "goodbye",
"pardon": "sorry",
"bienvenue": "welcome",
"nouveau": "new",
"heure": "hour",
"année": "year",
"mois": "month",
"jour": "day"
}
def traduction(mot_fr):
assert mot_fr in dico_fr_en, f"Le mot {mot_fr} n'est pas présent dans le dictionnaire"
return dico_fr_en[mot_fr]
print(traduction("lycée"))
# Affichage des mots
print("Les mots disponibles sont :")
for mot in dico_fr_en:
print(f"- {mot}")
# Demande utilisateur
mot = input("Choisissez un mot à traduire en anglais : ")
mot_en = traduction(mot)
print(f"Le mot {mot} se traduit {mot_en} en anglais.")
# On a bien une erreur due à l'assert.
print(traduction("absent"))
Exercice n°2 : Scrabble
On dispose du dictionnaire suivant, dans lequel chaque lettre de l'alphabet (en majuscules) est associé au nombre de points qui lui est attribué au scrabble :
scrabble = {'A': 1, 'B': 3, 'C': 3, 'D': 2, 'E': 1, 'F': 4, 'G': 2, 'H': 4,
'I': 1, 'J': 8, 'K': 10, 'L': 1, 'M': 2, 'N': 1, 'O': 1,
'P': 3, 'Q': 8, 'R': 1, 'S': 1, 'T': 1, 'U': 1, 'V': 4,
'W': 10, 'X': 10, 'Y': 10, 'Z': 10}
Télécharger ce fichier qui sera à compléter selon les questions ci-dessous.
Question
Compléter la définition de la fonction
valeur_mot(mot)
qui prend en paramètre une chaîne de caractères constituée de lettres majuscules et qui renvoie le nombre de points que rapporterait ce mot au scrabble.Compléter la définition de la fonction
meilleure_lettre()
qui prend en paramètre un tableau dont les éléments sont des lettres majuscules et qui renvoie celle ayant la plus forte valeur au scrabble.En cas d'égalité, c'est la lettre ayant l'indice le plus élevé dans le tableau qui est renvoyée.
Indice
Question 1 : Le nombre de points d'un mot se calcule grâce à la somme des points de chaque lettre du mot. Il faut donc parcourir toutes les lettres du mot et consulter sa valeur dans le dictionnaire.
Indice
Question 2 : Simple parcours de liste où on regarde chaque éléments dans notre dictionnaire scrabble
. La spécificité est que la meilleure lettre doit être sauvegardée dans une variable, et on compare sa valeur à chaque nouvelle lettre dans la liste.
Cela ressemble à la fonction indice_min
sauf que :
on ne veut pas le minimum mais le maximum ;
on ne regarde pas la valeur de l'élément, mais sa valeur via le dictionnaire ;
on ne renvoie pas l'indice mais l'élément (la lettre).
Solution
scrabble = {'A': 1, 'B': 3, 'C': 3, 'D': 2, 'E': 1, 'F': 4, 'G': 2, 'H': 4,
'I': 1, 'J': 8, 'K': 10, 'L': 1, 'M': 2, 'N': 1, 'O': 1,
'P': 3, 'Q': 8, 'R': 1, 'S': 1, 'T': 1, 'U': 1, 'V': 4,
'W': 10, 'X': 10, 'Y': 10, 'Z': 10}
def valeur_mot(mot):
"""
Renvoie le nombre de points du mot passé en paramètre
:param mot: une chaîne de caractères constituée de lettres majuscules
:return: nombre de points de ce mot au scrabble
>>> valeur_mot("PYTHON")
20
>>> valeur_mot("JAVASCRIPT")
24
"""
score = 0
for lettre in mot:
score += scrabble[lettre]
return score
def meilleure_lettre(liste):
"""
Renvoie la lettre qui a le plus forte valeur dans le mot.
:param liste: liste NON VIDE de caractères
:return: caractère de liste ayant la plus forte valeur au scrabble
>>> meilleure_lettre(['B', 'A', 'K', 'D'])
'K'
>>> meilleure_lettre(['A', 'E', 'I'])
'I'
"""
# Cette variable enregistre la meilleure lettre. Par défaut, c'est la première de la liste
maximum = liste[0]
for lettre in liste:
# Supérieur ou égal, car en cas d'égalité, on renvoie la dernière rencontrée ayant la plus grande valeur.
if scrabble[lettre] >= scrabble[maximum]:
maximum = lettre
return maximum
##----- Programme principal et tests -----##
if __name__ == '__main__':
import doctest
doctest.testmod()
Exercice n°3 : Titanic
Le Titanic appareille de Southampton (Angleterre) le mercredi 10 avril à 12 h 15.
Six heures plus tard, à 18 h 15, il fait escale dans la rade de Cherbourg. Il y débarque 24 passagers et en embarque 274, amenés par les transbordeurs Nomadic et Traffic. Il appareille à 20 h 10.
Le Titanic fait route vers l'Irlande. Il arrive à Queenstown (aujourdhui Cobh) le 11 avril à 11 h 30. Il débarque 7 passagers et en embarque 120. À 13 h 30, le paquebot appareille et entame sa traversée de l'Atlantique vers New York.
Le 14 avril, à 23 h 40 (heure locale, GMT-3), il percute un iceberg au large de Terre-Neuve. Il sombre le 15 avril à 2 h 20, causant la mort de 1 524 personnes.
(source wikimanche)
On souhaite analyser les données de bord du Titanic lors de cette aventure. On dispose d'une liste Python avec des informations sur les passagers. Chaque élément de la liste est un passager représenté par un dictionnaire. En voici un extrait :
passagers = [
{'PassengerId': 1,
'Survived': False,
'Pclass': 3,
'Name': 'Braund, Mr. Owen Harris',
'Sex': 'male',
'Age': 22.0,
'SibSp': 1,
'Parch': 0,
'Ticket': 'A/5 21171',
'Fare': 7.25,
'Embarked': 'S'
},
{'PassengerId': 2,
'Survived': True,
'Pclass': 1,
'Name': 'Cumings, Mrs. John Bradley (Florence Briggs Thayer)',
'Sex': 'female',
'Age': 38.0,
'SibSp': 1,
'Parch': 0,
'Ticket': 'PC 17599',
'Fare': 71.2833,
'Cabin': 'C85',
'Embarked': 'C'
},
...
]
Télécharger ce fichier dans le même dossier que votre code Python.
Le fichier ci-dessus contient la liste non-exhaustive de 891 passagers. En raison de sa taille importante, son ouverture peut faire planter votre logiciel de programmation. Pensez donc à enregistrer votre travail régulièrement !
En cas d'absence d'information, la clé n'est pas présente ! Vous devez donc vous assurer que la clé existe avant de récupérer sa valeur.
Afin d'importer ces données, ajouter le code suivant dans votre fichier titanic.py
:
from donnees_titanic import passagers
Désormais, la variable passagers
contient cette liste de dictionnaires.
Question
Rédiger un programme qui :
affiche le nombre de passagers dans la liste (891) ;
vérifie que le passager 54 est :
Faunthorpe, Mrs. Lizzie (Elizabeth Anne Wilkinson) agée de 29 ans, embarquée à Southampton en classe 2 et a survécu au naufrage ;
affiche le nombre de survivants (342).
Sachant qu'il y a trois classes (
1
,2
et3
), écrire un programme qui affiche le pourcentage de survivants par classe.Sachant qu'un passager embarqué à Cherbourg est représenté par la valeur
'C'
associée à la clé'Embarked'
, écrire un programme qui donne le nombre de survivants embarqués à Cherbourg (18%).
Indice
Question 1 :
Le nombre de passagers correspond au nombre d'éléments dans notre liste
passagers
.Pour chercher un passager, on doit parcourir tous les éléments de la liste et vérifier pour chaque élément (qui est donc un dictionnaire) si la valeur de clé
'PassengerId'
vaut54
, auquel cas on peut afficher les informations.De même, il faut parcourir toutes les données, en stockant dans une variable (initialement initialisée à zéro) le nombre de survivants.
Indice
Question 2 : Il faut encore parcourir tous les passagers, et stocker dans des variables le nombre de passagers par classe et le nombre de survivants par classe. Ensuite, un simple calcul de pourcentage, et le tour est joué !
Indice
Question 3 : Et c'est encore pareil ! Il faut parcourir tous les passagers, et stocker dans des variables le nombre de passagers embarqués à Cherbourg et le nombre de survivants embarqués à Cherbourg.
Solution
from donnees_titanic import passagers
# Question 1
print(f"Il y a {len(passagers)} passagers dans cette liste.")
id_recherche = 54
for passager in passagers:
if passager['PassengerId'] == id_recherche:
print(passager)
nb_surviants = 0
for passager in passagers:
if passager['Survived']:
nb_surviants += 1
print(f"Il y a {nb_surviants} survivants dans cette liste.")
# Question 2
nb_surviants_par_classe = [0, 0, 0, 0]
nb_passagers_par_classe = [0, 0, 0, 0]
# Par simplicité, la classe 1 sera à l'indice 1, idem pour la classe 2 et la classe 3.
for passager in passagers:
if 'Pclass' in passager and 'Survived' in passager:
nb_passagers_par_classe[passager['Pclass']] += 1
if passager['Survived']:
nb_surviants_par_classe[passager['Pclass']] += 1
print("Les pourcentages de survie sont :")
for classe in [1, 2, 3]:
print(f"- Classe {classe} : {nb_surviants_par_classe[classe] * 100 // nb_passagers_par_classe[classe]}%")
# Question 3
nb_passager_cherbourg = 0
nb_survivants_cherbourg = 0
for passager in passagers:
if 'Embarked' in passager:
if passager['Embarked'] == 'C':
nb_survivants_cherbourg += 1
nb_passager_cherbourg += 1
print(f"{nb_survivants_cherbourg * 100 // nb_passager_cherbourg}% des passagers embarqués à Cherbourg ont survécu.")
Exercice bonus : Compter des occurrences
On souhaite écrire un programme qui compte les occurences de mots dans un texte afin de connaître les mots les plus fréquents.
Question
Compléter la définition de la fonction
occurences(sequence)
en respectant les spécifications.Compléter la définition de la fonction
compte_mots(phrase)
en respectant les spécifications.Télécharger le texte du « Petit Chaperon Rouge » ci-dessous dans le même dossier que le code Python.
Dans le programme principal, importer ce texte puis écrire les instructions nécessaires pour afficher, dans la console, chaque mot de ce texte suivi de son nombre d'occurrences dans le texte.
Compléter la définition de la fonction
compte_tous_mots(phrase)
en respectant ses spécifications.Appliquer ensuite, dans le programme principal, cette fonction au texte du « Petit Chaperon Rouge ».
Compléter la définition de la fonction
plus_frequent(dico, longueur)
qui prend en paramètre un dictionnaire dont les clés sont des chaînes de caractères et un entier strictement positif longueur.Cette fonction renvoie un tableau constitués des chaînes de caractères de taille la longueur spécifiée et associées à la plus grande valeur dans le dictionnaire.
Télécharger ce fichier dans le même dossier que votre code Python.
Indice
Question 3 : Si f
est le nom d'une variable faisant référence à un fichier texte, alors f.read()
renvoie le contenu de ce fichier texte sous la forme d'une unique chaîne de caractères.
On utilisera le code f = open('nom_du_fichier')
pour obtenir cette variable.
Indice
Question 5 : C'est un algorithme de recherche du maximum légèrement modifié :
lorsqu'on rencontre un nouveau maximum, on ré-initialise le tableau ;
lorsqu'on rencontre un mot de même « valeur », on l'incorpore au tableau.
Solution
def occurrences(sequence):
"""
Compte les occurences dans une liste
:param sequence: Une séquence ordonnée (tuple, list ou str)
:return: dictionnaire tel que :
- les clefs sont les valeurs de la séquence
- les valeurs sont les occurrences de ces clefs dans la séquence
>>> occurrences([4, 2, 3, 4, 1, 4, 3, 4])
{4: 4, 2: 1, 3: 2, 1: 1}
>>> occurrences("abracadrabra")
{'a': 5, 'b': 2, 'r': 3, 'c': 1, 'd': 1}
"""
dico = {}
for valeur in sequence:
if valeur in dico:
# Si la valeur est déjà dans le dico, on incrémente
dico[valeur] += 1
else:
# Sinon on l'ajoute
dico[valeur] = 1
return dico
def compte_mots(phrase):
"""
Compte les occurences de mots dans une chaîne de caractères
:param phrase: une chaîne de caractère comportant des espaces
:return: dict – dictionnaire tel que :
- les clés sont les mots de la chaine
- les valeurs sont les occurrences des mots
>>> compte_mots("a b a c ab")
{'a': 2, 'b': 1, 'c': 1, 'ab': 1}
"""
# On découpe la phrase à chaque espace (méthode split)
liste = phrase.split()
# On se sert de la fonction précédente
return occurrences(liste)
def compte_tous_mots(phrase):
"""
Compte le nombre de mots selon la taille dans une chaîne de caractères
:param phrase: une chaîne de caractère comportant des espaces
:return: dict – dictionnaire tel que :
- les clés sont des entiers (longueurs possibles pour un mot)
- les valeurs sont les occurrences des mots ayant cette longueur
>>> compte_tous_mots("a b a c ab")
{1: 4, 2: 1}
"""
dico_mots = compte_mots(phrase)
dico_taille = {}
for mot, nombre in dico_mots.items():
taille = len(mot)
if taille in dico_taille:
# Si la taille du mot est déjà dans le dico, on ajoute son nombre d'occurences
dico_taille[taille] += nombre
else:
# Sinon on le rajoute
dico_taille[taille] = nombre
return dico_taille
def plus_frequent(dico, longueur):
"""
Renvoie les mots les plus fréquents de la longueur donnée. En cas d'égalité en fréquence, on renverra tous les mots
de cette égalité.
:param dico: dictionnaire de chaines avec leur occurence
:param longueur: longueur à regarder pour trouver les mots
:return: string – chaine de taille longueur ayant
l'occurence la plus grande.
>>> plus_frequent({'a': 3, 'b': 2, 'c': 3, 'ab': 5}, 1)
['a', 'c']
"""
# Intitialisation à une liste vide et une fréquence nulle
maximum = []
frequence_maximum = 0
for mot in dico:
# Vérification de la contrainte de longueur
if len(mot) == longueur:
# Vérification de la fréquence du mot
if dico[mot] > frequence_maximum:
# Si plus grand, on remet à zéro
maximum = [mot]
frequence_maximum = dico[mot]
elif dico[mot] == frequence_maximum:
# Si égalité, on ajoute dans notre liste de maximums
maximum.append(mot)
# Sinon, on ne fait rien
return maximum
##----- Programme principal et tests -----##
if __name__ == '__main__':
import doctest
doctest.testmod()
# Importation du fichier du "Petit Chaperon Rouge"
f = open("Petit_Chaperon_Rouge_Sans_Ponctuation.txt")
texte = f.read()
# Question 3
dico = compte_mots(texte)
for mot, nombre in dico.items():
print(f"{mot} -> {nombre}")
# Question 4
print(compte_tous_mots(texte))
# Question 5
for longueur in range(13, 0, -1):
print(f"Mot(s) de longueur {longueur} les plus fréquents : {plus_frequent(dico, longueur)}.")