Manipulation des chaînes de caractères [Fermé]

Signaler
Messages postés
31
Date d'inscription
mercredi 2 juillet 2014
Statut
Membre
Dernière intervention
20 février 2018
-
 Utilisateur anonyme -
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 ?
Messages postés
31
Date d'inscription
mercredi 2 juillet 2014
Statut
Membre
Dernière intervention
20 février 2018
8
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

Utilisateur anonyme
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).
Messages postés
31
Date d'inscription
mercredi 2 juillet 2014
Statut
Membre
Dernière intervention
20 février 2018
8
ouais mais les mots dans le fichier DICO sont en minuscule, donc il faudrait que je les convertissent en majuscule avec l'instruction " .capitalize() "
Utilisateur anonyme
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()