Partage
  • Partager sur Facebook
  • Partager sur Twitter

Taille des mots d'un dictionnaire

Sujet résolu
    17 février 2021 à 18:22:44

    Bonjour,

    Je bloque sur un exercice Python, j'ai besoin de votre aide.

    La consigne est la suivante : Fonction qui à partir de l'adresse d'un fichier contenant des mots retourne un dictionnaire où la clé est le mot et la valeur associée est taille du mot, il ne faut pas compter le caractère '\n'. Compléter les lignes contenant pass.

    Entrée : str

    Sortie : un dictionnaire

    def dicoLongMot(adr):
        with open(adr,'r',encoding='utf-8') as f:
            listeMot=f.readlines()
        dicoRep={}
        for m in listeMot:
            if m[-1]=="\n":
                pass
            else:
                pass
        return dicoRep

        adrMot="./listeMotTest.txt"
        print(dicoLongMot(adrMot))
    
    """
     doit afficher {'abaissable': 10, 'abaissante': 10, 'abaissée': 8, 'abaissement': 11, 'abaisser': 8, 'abaisseur': 9, 'abajoue': 7,
     'abalober': 8, 'abalone': 7, 'abalourdir': 10, 'abandon': 7, 'abandonnataire': 14, 'abandonnatrice': 14, 'abandonnement': 13,
     'abandonner': 10, 'abandonnique': 12, 'abandonnisme': 12, 'abaque': 6, 'abarticulaire': 13, 'abarticulation': 14}
    """

    Le fichier séparé listeMotTest.txt contient :

    abaissable
    abaissante
    abaissée
    abaissement
    abaisser
    abaisseur
    abajoue
    abalober
    abalone
    abalourdir
    abandon
    abandonnataire
    abandonnatrice
    abandonnement
    abandonner
    abandonnique
    abandonnisme
    abaque
    abarticulaire
    abarticulation



    J'ai donc essayé ceci :

    def dicoLongMot(adr):
        with open(adr,'r',encoding='utf-8') as f:
            listeMot=f.readlines()
        dicoRep={}
        for m in listeMot:
            if m[-1]=="\n":
                dicoRep[listeMot[len(m)][:-1]]=len(m)
            else:
                dicoRep[listeMot[len(m)]]=len(m)
        return dicoRep

    Mais ça ne compte pas correctement et ne retourne pas tous les mots :(  

    (retourne ceci):

    {'abandonnataire': 11, 'abalourdir': 9, 'abandonnatrice': 12, 'abandon': 10, 'abalone': 8, 'abandonnique': 15, 'abandonner': 14, 'abandonnement': 13, 'abalober': 7, 'abandonner\n': 14}

    Comment puis-je faire s'il vous plaît ?



    • Partager sur Facebook
    • Partager sur Twitter
      17 février 2021 à 18:32:14

      regarde ce que tu vas chercher dans listeMot quand tu créé ton dictionnaire, ça devrait te sauter aux yeux (Rappel: on est dans une boucle qui parcours les mots)
      • Partager sur Facebook
      • Partager sur Twitter
        17 février 2021 à 18:32:27

        Avec .readlines toutes les "mots" de listeMot se terminent par '\n' sauf peut être la dernière.

        Soit m le mot, si je dois créer une entrée dans le dictionnaire ayant pour clef m et pour valeur la longueur du mot, j'écris dico[m] = len(m).

        • Partager sur Facebook
        • Partager sur Twitter
          17 février 2021 à 19:53:22

          Merci, mais comment puis-je enlever le '\n' à la fin de chaque clés avec ce code ? :

          def dicoLongMot(adr):
              """ A COMPLETER
              Fonction qui à partir de l'adresse d'un fichier contenant des mots retourne un dictionnaire
              où la clé est le mot et la valeur associée est taille du mot il ne faut pas compter le caractère '\n'
              Entrée : str
              Sortie : un dictionnaire
              """
              with open(adr,'r',encoding='utf-8') as f:
                  listeMot=f.readlines()
              dicoRep={}
              for m in listeMot:
                  if m[-1]=="\n":
                      dicoRep[m]=len(m)
                  else:
                      dicoRep[m]=len(m)
              return dicoRep


          qui retourne : {'abaissable\n': 11, 'abaissante\n': 11, 'abaissée\n': 9, 'abaissement\n': 12, 'abaisser\n': 9, 'abaisseur\n': 10, 'abajoue\n': 8, 'abalober\n': 9, 'abalone\n': 8, 'abalourdir\n': 11, 'abandon\n': 8, 'abandonnataire\n': 15, 'abandonnatrice\n': 15, 'abandonnement\n': 14, 'abandonner\n': 11, 'abandonnique\n': 13, 'abandonnisme\n': 13, 'abaque\n': 7, 'abarticulaire\n': 14, 'abarticulation': 14}

          • Partager sur Facebook
          • Partager sur Twitter
            17 février 2021 à 20:02:07

            Tu sais déjà le faire puisque tu le fais dans le premier code que tu as posté !
            • Partager sur Facebook
            • Partager sur Twitter

            Blond, bouclé, toujours le sourire aux lèvres...

              17 février 2021 à 20:13:40

              J'ai essayé, mais en reprenant mon code précédent et celui-ci, j'obtiens une erreur :/

              def dicoLongMot(adr):
                  with open(adr,'r',encoding='utf-8') as f:
                      listeMot=f.readlines()
                  dicoRep={}
                  for m in listeMot:
                      if m[-1]=="\n":
                          dicoRep[[m][:-1]]=len(m)
                      else:
                          dicoRep[m]=len(m)
                  return dicoRep


              TypeError: unhashable type: 'list'

              • Partager sur Facebook
              • Partager sur Twitter
                17 février 2021 à 21:10:53

                Pourquoi tu met des crochets autour de la variable m ?

                >>> m = "lala"
                >>> m[:-1]
                'lal'
                



                -
                Edité par LoupSolitaire 17 février 2021 à 21:12:01

                • Partager sur Facebook
                • Partager sur Twitter

                Blond, bouclé, toujours le sourire aux lèvres...

                  18 février 2021 à 0:19:08

                  Bonjour.

                  Petite réflexion perso, ne faudrait-il pas plutôt écrire

                  if m[-1]=="\n":
                      dicoRep[m[:-1]] = len(m-1)
                  else:
                      dicoRep[m] = len(m)
                  • Partager sur Facebook
                  • Partager sur Twitter

                  PB68

                    18 février 2021 à 1:57:40

                    Je ne veux pas être rabat-joie. :)
                    N'est-ce pas  len(m)-1  au lieu de  len(m-1)
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Le Tout est souvent plus grand que la somme de ses parties.

                      18 février 2021 à 7:39:55

                      PierrotLeFou a écrit:

                      Je ne veux pas être rabat-joie. :)
                      N'est-ce pas  len(m)-1  au lieu de  len(m-1)


                      Bien vu !!! J'aurais mieux fait de me coucher 😩😩😩
                      • Partager sur Facebook
                      • Partager sur Twitter

                      PB68

                        3 mars 2021 à 23:20:33

                        PierrotLeFou a écrit:

                        Je ne veux pas être rabat-joie. :)
                        N'est-ce pas  len(m)-1  au lieu de  len(m-1)

                        PB68 a écrit:

                        Bonjour.

                        Petite réflexion perso, ne faudrait-il pas plutôt écrire

                        if m[-1]=="\n":
                            dicoRep[m[:-1]] = len(m-1)
                        else:
                            dicoRep[m] = len(m)

                        Bien vu !!! J'aurais mieux fait de me coucher 😩😩😩


                        Le programme final que j'avais écrit pour l'exercice et testé était :

                        def dicoLongMot(adr):
                            with open(adr,'r',encoding='utf-8') as f:
                                listeMot=f.readlines()
                            dicoRep={}
                            for m in listeMot:
                                if m[-1]=="\n":
                                    dicoRep[(m)[:-1]]=len(m) -1
                                else:
                                    dicoRep[m]=len(m)
                            return dicoRep


                        Mais merci encore ^^




                        • Partager sur Facebook
                        • Partager sur Twitter
                          4 mars 2021 à 1:40:16

                          CobValGaming a écrit:

                          Le programme final que j'avais écrit pour l'exercice et testé était :

                          def dicoLongMot(adr):
                              with open(adr,'r',encoding='utf-8') as f:
                                  listeMot=f.readlines()
                              dicoRep={}
                              for m in listeMot:
                                  if m[-1]=="\n":
                                      dicoRep[(m)[:-1]]=len(m) -1
                                  else:
                                      dicoRep[m]=len(m)
                              return dicoRep








                          J'ai compris que ce code suivait un canevas proposé dans l'exercice. Toutefois, je ne trouve pas ce canevas forcément très heureux. Il y a deux choses que je trouve gênantes :

                          • on parcourt deux fois la liste des mots : une fois quand on extrait les lignes du fichier et une deuxième fois quand on parcourt la liste
                          • le branchement pour savoir si un \n termine la ligne est probablement très coûteux alors que son placement est prévisible (en théorie, toutes les lignes sauf la dernière)

                          Pour le premier point, il suffirait de parcourir les lignes du fichier avec une boucle for, sans readlines, c'est d'ailleurs indiqué qqpart dans la doc officielle : Note that it’s already possible to iterate on file objects using for line in file: ... without calling file.readlines().

                          Pour le deuxième, il semble, d'après mes essais et peut-être d'après ce que dit le tutoriel Python officiel ICI, qu'en fait, même la dernière ligne est systématiquement suivie d'un \n dans le retour de la lecture par itération (ce que j'ignorais avant cet essai).

                          Enfin, puisqu'on cherche à supprimer un saut de ligne qui suit un mot, il me semble plus adapté d'utiliser rstrip. Au total j'obtiens le code suivant :

                          def dicoLongMot(adr):
                              with open(adr,'r',encoding='utf-8') as f:
                                  return {m.rstrip():len(m)-1 for m in f}
                          
                          print(*dicoLongMot("mots.txt").items(), sep='\n')

                          qui affiche :

                          ('abaissable', 10)                                                                                                                                                                                
                          ('abaissante', 10)                                                                                                                                                                                
                          ('abaissée', 8)                                                                                                                                                                                   
                          ('abaissement', 11)                                                                                                                                                                               
                          ('abaisser', 8)                                                                                                                                                                                   
                          ('abaisseur', 9)                                                                                                                                                                                  
                          ('abajoue', 7)                                                                                                                                                                                    
                          ('abalober', 8)                                                                                                                                                                                   
                          ('abalone', 7)                                                                                                                                                                                    
                          ('abalourdir', 10)                                                                                                                                                                                
                          ('abandon', 7)                                                                                                                                                                                    
                          ('abandonnataire', 14)                                                                                                                                                                            
                          ('abandonnatrice', 14)                                                                                                                                                                            
                          ('abandonnement', 13)                                                                                                                                                                             
                          ('abandonner', 10)                                                                                                                                                                                
                          ('abandonnique', 12)                                                                                                                                                                              
                          ('abandonnisme', 12)                                                                                                                                                                              
                          ('abaque', 6)                                                                                                                                                                                     
                          ('abarticulaire', 13)                                                                                                                                                                             
                          ('abarticulationoRep', 18)   

                          avec un fichier mots.txt dont voici le contenu (noter la dernière ligne) :





                          • Partager sur Facebook
                          • Partager sur Twitter
                            4 mars 2021 à 3:44:54

                            with open(name, encoding="utf-8") as file:
                                return {w: len(w) for w in map(str.rstrip, file) if w}
                            • Partager sur Facebook
                            • Partager sur Twitter

                            Taille des mots d'un dictionnaire

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown