Si certains exercices n'ont pas pu être terminés dans le cadre de cette séance, il est fortement conseillé de les terminer par vous-même chez vous ou en salle libre service.
Le but de ce TP est de manipuler des tableaux, des chaines de caractères et des tableaux de chaines de caractères.
Téléchargez les fichiers compressés suivants :
Vous devez copier ces fichiers dans le répertoire contenant vos fichiers Python, sans les décompresser.
Vous pouvez ensuite copier la fonction suivante dans votre fichier Python et l'utiliser pour récupérer la liste des mots correspondants :
def dictionnaire(fichier): """ renvoie la liste de tous les mots contenus dans le fichier dont le nom est passé en argument argument : fichier, de type chaine de caractères. C'est le nom du fichier compressé contenant le dictionnaire résultat : de type liste de chaines de caractères. Chaque élément de la liste correspond à une ligne du fichier""" import zipfile import sys f = zipfile.ZipFile(fichier, 'r') l = f.namelist() if len(l) != 1: print("*** L'archive devrait contenir exactement 1 fichier mais en contient {}".format(len(l))) sys.exit(1) r = f.read(l[0]).decode(encoding="UTF-8", errors="strict").split("\n") return [m for m in r if len(m) != 0]
Par exemple, pour obtenir le 113-ème mot du dictionnaire « le Littré », on peut faire :
>>> dico = dictionnaire("littre.zip") >>> dico[112] 'abondance'
Cherchez le nombre de mots dans le dictionnaire littre.zip
et dans le dictionnaire dico.zip
.
Dans toute la suite de l'énoncé de TP, la variable dico
représentera un dictionnaire obtenu de cette manière. Il ne s'agit de fait pas du nom d'un fichier, ni du fichier lui-même.
Attention : si l'interprète doit afficher tout le dictionnaire, cela prendra beaucoup de temps. Il est donc déconseillé de rentrer des expressions dont le résultat est très long...
Écrivez une fonction mots_n_lettres(dico, n)
qui prend un dictionnaire (une liste de mots) en argument et qui renvoie la liste des mots contenant exactement n
lettres.
Testez ensuite votre fonction pour trouver tous les mots du dictionnaire « le Littré » contenant exactement 22 lettres et pour compter le nombre de mots de 10 lettres dans le dictionnaire avec conjugaisons.
Lorsque l'on fait des mots croisés, disposer de fonctions permettant de rechercher, dans un dictionnaire, des mots qui commencent ou se terminent par des lettres connues peut se révéler d'une grande aide. Nous vous proposons d'écrire de telles fonctions dans ce qui suit. Vous pourrez ensuite les proposer aux membres cruciverbistes de votre famille, qui vous en seront reconnaissants ad vitam aeternam.
Écrivez une fonction mot_commence_par(mot, prefixe)
qui renvoie True
si l'argument mot
commence par prefixe
. Par exemple :
>>> mot_commence_par("temoignage", "te") True >>> mot_commence_par("chouette", "choux") False
Écrivez une fonction mots_commencent_par(dico, prefixe)
qui renvoie la liste des mots d'un dictionnaire qui commencent par prefixe
.
Combien de mots commençant par "chou" existe-t-il dans le dictionnaire « le Littré » ?
Refaites les deux questions précédentes pour rechercher les mots se terminant par un suffixe donné.
Il est conseillé d'écrire une petite fonction supplémentaire lettre_i_droite(mot, i)
renvoyant la i
-ème lettre d'un mot en partant de la fin :
>>> lettre_i_droite("chat", 0) 't' >>> lettre_i_droite("chat", 1) 'a' >>> lettre_i_droite("chat", 3) 'c'
Quels sont les mots du dictionnaire « le Littré » se terminant par "chou"
?
Combinez les fonctions précédentes (et uniquement celles ci) pour écrire une fonction mots_debut_fin_n(dico, prefixe, suffixe, n)
qui permet de trouver la liste des mots qui :
prefixe
,
suffixe
,
n
lettres.
Votre fonction ne devra contenir ni boucle for
ni structure conditionnelle if
.
Combien y a-t-il de mots commençant par "cas"
, se terminant par "ns"
et comportant 12 lettres dans le dictionnaire avec conjugaisons ?
Les fonctions écrites précédemment ne permettent pas de rechercher des mots lorsqu'on connaît des lettres au milieu du mot. Nous allons corriger ce problème.
Écrivez une fonction mot_correspond(mot, motif)
qui renvoie True
ou False
suivant que mot
correspond, ou pas, au motif donné.
Un motif est un chaine de caractères pouvant contenir des « jokers », représentés par le caractère "."
, pouvant remplacer n'importe quelle lettre. Ainsi, on aura :
>>> mot_correspond("tarte", "t..t.") True >>> mot_correspond("cheval", "c..v..l") False >>> mot_correspond("cheval", "c..v.l") True
Écrivez une fonction mots_motif(dico, motif)
qui renvoie la liste de tous les mots d'un dictionnaire qui correspondent au motif donné.
Combien y a-t-il de mots correspondant au motif "p..h.s"
dans le dictionnaire avec conjugaisons ?
(Bonus, facultatif)
Modifiez la fonction mot_correspond(mot, motif)
pour qu'elle ne tienne pas compte des lettres accentuées :
>>> mot_correspond("pêches", ".ech..") True
Avec la version actuelle, on obtient le résultat False
car le caractère "ê"
est différent du caractère "e"
.
Voici la liste des lettres accentuées en français : à ä â ç ê è é ë î ï ô ö ù ü û.
L'objectif des fonctions que nous vous demandons d'écrire ci-après est d'aider une personne à construire des mots, les plus longs possibles, à partir d'une liste de lettres.
Écrivez la fonction apparait(lettre, mot)
qui renvoie True
ou False
suivant que la lettre passée en paramètre apparaît ou non dans le mot.
Utilisez cette fonction pour écrire la fonction mot_possible(mot, lettres)
qui renvoie True
ou False
suivant que le mot peut s'obtenir avec les lettres passées en paramètres. Ces lettres sont fournies à la fonction sous la forme d'une chaine de caractères.
Par exemple :
>>> mot_possible("lapin", "abilnpq") True >>> mot_possible("cheval", "abilnpq") False
Écrivez la fonction mot_optimal(dico, lettres)
qui renvoie le mot du dictionnaire le plus long que l'on peut faire avec les lettres passées en paramètres.
Au Scrabble, les joueurs cherchent à former des mots avec un ensemble de lettres données. Ces lettres sont inscrites sur des jetons. Au début et tout au long de la partie, les joueurs piochent des jetons. Chacun dispose ainsi d'une « main » composée de la liste de toutes les lettres inscrites sur les jetons qu'il a piochés.
Nous pourrions envisager d'avoir recours aux fonctions précédentes pour aider un joueur à construire des mots à partir des lettres dont il dispose dans sa main. Ces fonctions ne peuvent cependant pas être utilisées telles que, car elles ne tiennent pas compte du nombre de lettres requises pour écrire un mot donné. Il faut en effet, par exemple, 2 lettres "a"
pour écrire "chapeau"
. Or la fonction mot_possible
donne :
>>> mot_possible("chapeau", "abcehpuv") True
Au lieu de simplement regarder si une lettre apparaît dans le mot, il faut compter le nombre de fois où cette lettre apparaît.
Écrivez une deuxième version des fonctions mot_possible(mot, lettres)
et mot_optimal(dico, lettres)
prenant en compte la remarque précédente. Vous les appellerez mot_possible_scrabble
et mot_optimal_scrabble
.
>>> mot_possible_scrabble("chapeau", "abcehpuv") False >>> mot_possible_scrabble("chapeau", "abcehpuva") True