Manipulation des chaînes de caractères

Fermé
KEVIN471 Messages postés 30 Date d'inscription mercredi 2 juillet 2014 Statut Membre Dernière intervention 20 février 2018 - 24 mai 2015 à 18:52
 Utilisateur anonyme - 25 mai 2015 à 17:52
Bonjour,

je suis en train de programmer le jeu du mot le plus long et je suis en train de créer les fonctions "liste_mots_valides(donne)" et "test_mot_valide(donne,m)" qui ne marche pas. voici mon code:



from random import randint


liste_voyelle=['A','E','I','O','U','Y']
liste_consonne=['B','C','D','F','G','H','J','K','L','M','N','P','Q','R','S','T','V','W','X','Z']
liste_alphabet=['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']


def donne():
    """Cette fonction demande 9 fois à l'utilisateur s'il veut une consonne ou une voyelle, puis donne une
    lettre au hasard dans la catégorie qu'il a choisie. La fonction renvoie la liste des lettres choisies et les
    affiche"""
    c=0
    while c<9:
        m=input("consonne ou voyelle ? \n")
        if m ==str("consonne"):
            m=liste_consonne[randint(0,19)]
            print(m)
            c=c+1
        elif m ==str("voyelle"):
            m=liste_voyelle[randint(0,5)]
            print(m)
            c=c+1
        else:
            print("Repondez uniquement par consonne ou voyelle")

    

def liste_lettres(mot):
    """Cette fonction renvoie une liste L de 26 éléments. L [i] contient le nombre de lettres égales à
    alphabet [i] se trouvant dans le mot m . Par exemple liste_lettres('BABA') renvoie [2,2,0,...,0]
    affiche combien un mot a de A B C etc"""
    liste = [0 for i in range(26)]                     
    for lettre in mot:      
        k = liste_alphabet.index(lettre)            
        liste[k] = liste[k]+1                          
    return liste                                    

        

def compare_lettres(L1,L2):
    """Cette fonction prend en argument deux listes d'entiers de longueur 26. Elle renvoie True si pour
    tout i compris entre 0 et 25, L1[i]<=L2[i] et False sinon."""
    for i in range(len(L1)):
        if L1[i]>L2[i]:    # fonction qui contrôle que la liste L1 (Mot) comporte moins de lettre que dans L2(Donne)
            return False
    return True
        


def liste_mots(fichier):
    
    """Cette fonction prend en argument le nom d'un fichier de type texte et renvoie la liste de tous les mots
    (séparés par des passages à la ligne) de longueur inférieure ou égale à 9 qui se trouvent dans le
    fichier."""
    g=open(fichier,"r")
    for line in g:
        if len(line)<=9:
            print(line)
            print("\n") 
        
def test_mot_valide(donne,m):
    
    """Cette fonction prend en argument une donne de 9 lettres et un mot. Elle teste si le mot est bien formé
    avec les 9 lettres données et qu'il est dans de dictionnaire."""
    g=open("DICO.txt","r")
    g=g.read()
    dico = g.split('\n')
    if m in dico and compare_lettres(liste_lettres(m),liste_lettres(donne)):  
        print("le mot est bien formé")
    else:
        print("Le mot est incorrect")


def liste_mots_valides(donne):
    """Cette fonction prend en argument une donne de 9 lettres et renvoie la liste des mots du dictionnaire
    les plus longs que l'on peut former avec ces 9 lettres."""
  
    g=open("DICO.txt","r")
    g=g.read()
    dico = g.split('\n')
    for i in range(len(dico)):    
        if len(dico[i])<=9 and liste_lettres(donne)==liste_lettres(line):
            print(dico[i])



Merci d'avance.

3 réponses

Salut,

Ta fonction test_mot_valide paraît juste. Pour la deuxième fonction par contre, c'est un peu plus compliqué, enfin je pense. Peut tu me dire que contient, par exemple, le fichier DICO.txt ?

Pour ta deuxième fonction, tu test si le mot lu dans DICO.txt a une longueur inférieure ou égale à 9 (OK) et si liste_lettre(donne) = liste_lettre(line). Déjà line n'est pas définie (sauf erreur de ma part). Et ça veut dire que si deux mots possèdent les mêmes lettres alors ces mots sont égaux. As-tu pensé aux anagrammes ?
0
KEVIN471 Messages postés 30 Date d'inscription mercredi 2 juillet 2014 Statut Membre Dernière intervention 20 février 2018 10
Modifié par KEVIN471 le 25/05/2015 à 16:13
le fichier DICO.txt est un fichier txt contenant les principaux mots de la langue française(1 mot par ligne).

Pour la fonction liste_mot valide il y'a en effet un problème car line ne n'est pas définie je l'ai remplacé par len(dico[i]) mais toujours un message d'erreur lorsque je test la fontion


Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    liste_mots_valides("mangerslqo")
  File "F:\PROJET ISN\LE MOT LE PLUS LONG 4(2).py", line 91, in liste_mots_valides
    if len(dico[i])<=9 and liste_lettres(donne)==liste_lettres(len(dico[i])):
  File "F:\PROJET ISN\LE MOT LE PLUS LONG 4(2).py", line 42, in liste_lettres
    k = liste_alphabet.index(lettre)               # recherche les mots présents dans liste "alphabet"
ValueError: 'm' is not in list

0
Utilisateur anonyme
25 mai 2015 à 16:16
Bah ta liste liste_alphabet ne contient que des lettres majuscules ... vérifie ton mot pour voir s'il est bien en majuscule (tu peux utiliser .capitalize() pour mettre en majuscule il me semble).
0
KEVIN471 Messages postés 30 Date d'inscription mercredi 2 juillet 2014 Statut Membre Dernière intervention 20 février 2018 10
25 mai 2015 à 16:46
ouais mais les mots dans le fichier DICO sont en minuscule, donc il faudrait que je les convertissent en majuscule avec l'instruction " .capitalize() "
0
Utilisateur anonyme
25 mai 2015 à 17:52
ou alors tu modifies tes listes alphabet voyelle et consonne pour que ce soit en minuscule. il y a même une instruction pour mettre en minuscule je crois. Pour minuscule : .lower(). Pour majuscule : .upper()
0