Probleme de liste python

Bonjour, ce que je cherche à faire est un petir programme permettant de retrouver un mot à partir de lettres dans le mauvais ordre (ex: à partie de "hcta" retrouver "chat" ou tous les autres mots possible). Pour cela, j ai implémenté directement dans le code (pour execution + rapide) une liste de 300000 mots en francais. Ce que mon programme fait, c est à partir d'un (mot dans le mauvais ordre), il retrie la liste des 300000 mots en une sous-liste contenant des mots avec une des lettres contenur dans le (mot dans le mauvais ordre) ensuite il repete l'operation a partir de la sous-liste avec la 2 eme lettre du mot, etc, et ensuite il filltre les mots qui font la bonne taille:
wordstring = """abricot
.......
.......
.......
.......
zython
zythons
zythum
zythums"""

interwordlist = wordstring.splitlines()
wordlistfix = []
for line in interwordlist:
    pureword = str(line.strip())
    wordlistfix.append(pureword)

print(wordlistfix[0:10])


while True:
    badword = str(input("mot à remettre en ordre : "))
    wordlist = wordlistfix
    wordindex = range(int(len(wordlistfix)))
    for lettre in badword:
        selectindex = []
        for index in wordindex:
            word = wordlist[index]
            if lettre in word:
                selectindex.append(index)
                i = word.find(lettre)
                newword = ""
                for n in range(len(word)):
                    if n != i:
                        newword = newword + word[n]
                    else:
                        pass
                wordlist[index] = newword
            else:
                continue
        if len(selectindex) < 1:
            print("aucun mot trouvé")
            break
        else:
            wordindex = selectindex
            continue
    for indexfinal in wordindex:
        if len(wordlistfix[indexfinal]) == len(badword):
            print("  ", wordlistfix[indexfinal])
        else:
            continue


Malgré ce cassage de crâne, le programme renvoie des mots qui n'ont rien avoir comme:
pour "hcat" (qui devrait normallement renvoyer "chat") me renvoie à la place, des mots comme : "lici, licn, loc, obia, oucn, ..... " ce qui ressemble à des morceaux de mots incomplets...

Quelqu'un aurrait il assez de matiere grise pour m'aider à conprendre ce qui ne fonctionne pas dans mon code ? J ai relu plusieurs fois, j ai meme essayé d'appliquer mon code a la main sur papier avec une petite liste, mais je ne comprends vraiment pas ce qui ne joue pas.

Merci d'avance

31 réponses

Résumé de la discussion

Le problème porte sur la reconstruction d'un mot à partir de lettres mélangées en utilisant une liste de mots français d'environ 300000 entrées, avec l'exemple 'hcta' devant devenir 'chat'. Des réponses proposent d'abord de vérifier la compatibilité de longueur entre le mot mélangé et les candidats, puis de filtrer les mots contenant les lettres une par une. D'autres préconisent de trier les lettres de chaque mot par ordre alphabétique et de vérifier l'appartenance via des dictionnaires, tout en discutant des diacritiques et de l'Unicode pour les cas accentués. En cas d'accentuation, certaines propositions explorent une approche hybride qui normalise les lettres pour l'appariement tout en conservant les formes diacritiques afin de filtrer les résultats.

Bobot (l’IA à votre service)
  1. Pour résumé, le code que Phil t'as donné au message 28 (donc avant que tu nous embrouille avec les accents) fait exactement ce que tu demandes.



    Donc vu que ça marche avec les accents et que tu parles d'un problème d'accent, on comprend l'inverse, et on te propose des solutions sans les accents. Et ça ne te va pas, donc forcément nous sommes un peu perdus.
    Donc je te propose une solution qui te donne les 2 résultats en fonction d'un paramètre dans la recherche et donc te laisse le choix de chercher en tenant compte des accents ou pas, à ta guise.
    Et ça ne te va toujours pas.

    yg_be finit par penser que ton ordinateur a une configuration "anormale" qui expliquerait qu'on ne se comprenne pas sur cette histoire d'accents, mais vu ta dernière réponse, ça n'est pas le cas.

    Donc y'a un moment, faut expliquer clairement ce que tu veux, éventuellement faire des captures d'écrans montrant un résultat incorrect en postant le code testé.

    1. Contributeur
      Cela peut-être aussi une différence entre les caractères accentués entrés par input() et ceux entrés dans la source Python.
      chars="Thérèse"
      th=input("?")
      if chars == th:
          print("bien!")
      else:
          print("oups!",chars, th)
    2. Contributeur
      ceci marche aussi très bien:
      def CreerDictionnaire(Mots):
          dico = {}
          for mot in Mots:
              cle = "".join(sorted(mot))
              if not cle in dico.keys():
                  dico[cle]=[]
              dico[cle].append(mot)
          return dico
      
      def ChercheMot(lettres, dico):
          cle = "".join(sorted(lettres))
          if cle in dico.keys():
              print("les mots sont", dico[cle])
          else:
              print("pas d'occurences")
              
      wordstring = """abricot
      chat
      chatte
      zythons
      zythum
      zythums
      pesai
      épais
      sépia
      oranges
      rongeas"""
      
      wordlistfix = wordstring.splitlines()
      print("La liste de mots", wordlistfix)
      
      dico = CreerDictionnaire(wordlistfix)
      print("Le dictionnaire")
      for d in dico.keys():
          print(d,"==>",dico[d])
      
      
      rep = "Q"
      
      while(True):
          mixed_word = input("\nmot à remettre en ordre (Q)uitter : ")
          if(mixed_word in ['q','Q']): break
          ChercheMot(mixed_word, dico)
    3. @yg_beOui, du coup, plus besoin de s’embêter à sortir les diacritiques.
  2. On ne m'a toujours pas répondu, ma question était est-ce qu'on peut utiliser les accents dans le input().

    Dans la reponse de Whismeril il peut afficher les resultats soit avec accents, soit sans accents, mais dans le input(), epais est dans les 2 cas sans accents.

    Ce que j'ai demandé, c'est comment pouvoir faire fonctionner le programme, tout simplement en considerant les é, è, â,... comme des lettres à part, c'est a dire comment faire pour qu'on puisse par exemple : écrire dans le input : " épsia " (avec l'accent), et que le programme nous renvoie uniquement les anagrames contenant " é ", c'est à dire : => sépia, épais (et c'est tout)

    Merci d'avance
    1. Regarde en détail, les résultats du message 46…
    2. Contributeur
      essaie ceci, qui t'affiche ce que tu tapes.
      while True:
          print("lu:",input("?"))
      

      cela te permettra de vérifier comment les caractères accentués sont traités sur ton ordi.
  3. En combinant la correction de yg_be et les anagrammes comme l'a proposé Phil à un moment

    from unidecode import unidecode
    import itertools as it
    
    class Dictionnaire:
         
        def __init__(self,  mot):
            self.lesMots = []
            self.ajouteMot(mot)
            
        def ajouteMot(self, mot):
            self.lesMots.append(mot)
    
        def __str__(self):
            return "{" + " - ".join(self.lesMots) + "}"
        
    def CreerDictionnaire(Mots):
        dico = {}
        for mot in Mots:
            cle = "".join(sorted(unidecode(mot)))
            if cle in dico.keys():
                dico[cle].ajouteMot(mot)
            else:
                dico[cle]=Dictionnaire(mot)
        return dico
    
    def ChercheMot(lettres, dico, ignorerDiacritiques = True):
        cle = "".join(sorted(unidecode(lettres)))
        if cle in dico.keys():
            if ignorerDiacritiques:
                print("en ignorant les diacritiques, les mots sont", dico[cle])
            else:
                anags = set("".join(e) for e in it.permutations(lettres, len(lettres)))
                res = []
                for mot in dico[cle].lesMots:
                    if(mot in anags):
                        res.append(mot)                   
                print("en prenant en compte les diacritiques, les mots sont", res)
        else:
            print("pas d'occurences")
            
    wordstring = """abricot
    chat
    chatte
    zythons
    zythum
    zythums
    pesai
    épais
    sépia
    oranges
    rongeas"""
    
    wordlistfix = wordstring.splitlines()
    print("La liste de mots", wordlistfix)
    
    dico = CreerDictionnaire(wordlistfix)
    print("Le dictionnaire")
    for d in dico:
        print(d)
    
    
    rep = "Q"
    
    while(True):
        mixed_word = input("\nmot à remettre en ordre (Q)uitter : ")
        if(mixed_word in ['q','Q']): break
        ChercheMot(mixed_word, dico)
        ChercheMot(mixed_word, dico, False)


    ce qui donne
    La liste de mots ['abricot', 'chat', 'chatte', 'zythons', 'zythum', 'zythums', 'pesai', 'épais', 'sépia', 'oranges', 'rongeas']
    Le dictionnaire
    abciort
    acht
    acehtt
    hnostyz
    hmtuyz
    hmstuyz
    aeips
    aegnors
    
    
    mot à remettre en ordre (Q)uitter : épais
    en ignorant les diacritiques, les mots sont {pesai - épais - sépia}
    en prenant en compte les diacritiques, les mots sont ['épais', 'sépia']
    
    
    mot à remettre en ordre (Q)uitter : epais
    en ignorant les diacritiques, les mots sont {pesai - épais - sépia}
    en prenant en compte les diacritiques, les mots sont ['pesai']
    
    
    mot à remettre en ordre (Q)uitter : tata
    pas d'occurences
    pas d'occurences
    
    
    mot à remettre en ordre (Q)uitter : oranges
    en ignorant les diacritiques, les mots sont {oranges - rongeas}
    en prenant en compte les diacritiques, les mots sont ['oranges', 'rongeas']
    
    
    mot à remettre en ordre (Q)uitter : 

    1. En fait, y'a même plus besoin de la classe
      from unidecode import unidecode
      import itertools as it
      
          
      def CreerDictionnaire(Mots):
          dico = {}
          for mot in Mots:
              cle = "".join(sorted(unidecode(mot)))
              if cle in dico.keys():
                  dico[cle].append(mot)
              else:
                  dico[cle]=[mot]
          return dico
      
      def ChercheMot(lettres, dico, ignorerDiacritiques = True):
          cle = "".join(sorted(unidecode(lettres)))
          if cle in dico.keys():
              if ignorerDiacritiques:
                  print("en ignorant les diacritiques, les mots sont", dico[cle])
              else:
                  anags = set("".join(e) for e in it.permutations(lettres, len(lettres)))
                  res = []
                  for mot in dico[cle]:
                      if(mot in anags):
                          res.append(mot)                   
                  print("en prenant en compte les diacritiques, les mots sont", res)
          else:
              print("pas d'occurences")
              
      wordstring = """abricot
      chat
      chatte
      zythons
      zythum
      zythums
      pesai
      épais
      sépia
      oranges
      rongeas"""
      
      wordlistfix = wordstring.splitlines()
      print("La liste de mots", wordlistfix)
      
      dico = CreerDictionnaire(wordlistfix)
      print("Le dictionnaire")
      for d in dico:
          print("clé '", d, "' => ", dico[d])
      
      
      while(True):
          mixed_word = input("\nmot à remettre en ordre (Q)uitter : ")
          if(mixed_word in ['q','Q']): break
          ChercheMot(mixed_word, dico)
          ChercheMot(mixed_word, dico, False)
    2. Contributeur
      @Utilisateur anonymeSi on ignore les diacritiques, ne suffit-il pas de supprimer les utilisations de unidecode?
    3. Contributeur
      @Utilisateur anonymec'est une hérésie de faire des permutations pour vérifier si deux mots sont des anagrammes!
    4. @yg_be
      cela existe parfois, avoir "besoin" d'une classe?

      En python, je ne sais pas, mais en C# ou Java, pas le choix tout est objet, donc même si tu n'en écris pas tu en utilises. Du coup, c'est une habitude que j'ai prise. Cela dit, si j'avais mieux chercher comment faire un dictionnaire, je m'en serais passé

      Si on ignore les diacritiques, ne suffit-il pas de supprimer les utilisations de unidecode?


      Partant d'un dictionnaire constitué sans les diacritiques, ça reste simple de refaire un tri sur les quelques mots obtenus pour ne garder que ceux qui ont les "bons" diacritiques. Y'a moultes façons de trier derrière, là je voulais juste réutiliser la proposition de Phil.
      On pourrait aussi constituer un dico de dico.
      La première clé est sans diacritique et chaque dico dans cette clé a sa clé avec les diacritiques. Ça serait peut être un peu plus long à constituer mais sans doute plus propre

      c'est une hérésie de faire des permutations pour vérifier si deux mots sont des anagrammes!

      cf ci dessus...
  4. unidecode* je voulais dire, je ne connais pas ce mod mais je vais essayer la methode de phil, le problème c'est que je voudrais quand même pouvoir ne pas ignorer les accents, et les utiliser dans mixed word afin que le code me remvoie uniquement le bon mots contenant les meme accents, vous voyez..
    1. Merci, la methode de classer par odre alphabétique les caracteres de chaque mot du dicos, puis verifier pour tout autre anagrame en replacant dans l'ordre alphabetique si le resultat figure dans la liste me semble en effet la plus rapide, je ne co aissais pas la methode avec join.

      Sinon, pour les accents, vous avez mal compris mon probleme. Je saurais comment faire pour ignorer les accents. Seulement, le problème est un autre : lorsque je mets par exemple badword = "éphélatn", le programme devrait me retourner =>"éléphant" car j'ai bel et bien spécifié les accents. Sauf que non, il me retourne rien, j ai comme l'impression que input() ignore les accents.

      On est bien d'accord que badword = "éét" devrait me renvoyer "été", mais non, ça ne fonctionne pas avec tout badword contenant des accents. Pourtant été, éléphant,... sont bien dans la liste.

      Je comprends pas
      1. Bah, il suffit de changer la variable dans le print:

        from unidecode import unidecode
        
        dico = ['abricot', 'chat', 'oranges', 'onagres', 'organes', 'rageons', 'épais', 'zython']
        dico_no_accents = [unidecode(s) for s in dico]
        print(dico_no_accents)
        
        while(True):
            mixed_word = input("\nmot à remettre en ordre (Q)uitter : ")
            if(mixed_word in ['q','Q']): break
        
            mixed_word_no_accents = unidecode(mixed_word)
            mixed_word_a = ''.join(sorted(mixed_word_no_accents))
        
            found = False
            for word in dico_no_accents:
                word_a = ''.join(sorted(word))
                if(word_a == mixed_word_a):
                    found = True
                    p = dico_no_accents.index(word)
                    print('Trouvé : ', dico[p])
        
            if(not found): print(mixed_word,'non trouvé ...')
        1. Ha oui aussi
      2. Un truc comme ça (pas concis du tout ;) ! )

        from unidecode import unidecode
        
        class Dictionnaire:
             
            def __init__(self, cle, mot):
                self.laCle = cle
                self.lesMots = []
                self.ajouteMot(mot)
                
            def ajouteMot(self, mot):
                self.lesMots.append(mot)
                            
            def __str__(self):
                return self.laCle + " => {" + " - ".join(self.lesMots) + "}"
        
        def CreerDictionnaire(Mots):
            dico = []
            for mot in Mots:
                cle = "".join(sorted(unidecode(mot)))
                if cle in (d.laCle for d in dico):
                    monIndex = [d.laCle for d in dico].index(cle)
                    dico[monIndex].ajouteMot(mot)
                else:
                    dico.append(Dictionnaire(cle,mot))
            return dico
        
        def ChercheMot(lettres, dico):
            cle = "".join(sorted(unidecode(lettres)))
            if cle in (d.laCle for d in dico):
                monIndex = [d.laCle for d in dico].index(cle) 
                print("les mots sont", dico[monIndex].lesMots)
            else:
                print("pas d'occurences")
                
        wordstring = """abricot
        chat
        chatte
        zythons
        zythum
        zythums
        pesai
        épais
        sépia
        oranges
        rongeas"""
        
        wordlistfix = wordstring.splitlines()
        print("La liste de mots", wordlistfix)
        
        dico = CreerDictionnaire(wordlistfix)
        print("Le dictionnaire")
        for d in dico:
            print(d)
        
        
        rep = "Q"
        
        while(True):
            mixed_word = input("\nmot à remettre en ordre (Q)uitter : ")
            if(mixed_word in ['q','Q']): break
            ChercheMot(mixed_word, dico)
        
        


        ce qui donne
        La liste de mots ['abricot', 'chat', 'chatte', 'zythons', 'zythum', 'zythums', 'pesai', 'épais', 'sépia', 'oranges', 'rongeas']
        Le dictionnaire
        abciort => {abricot}
        acht => {chat}
        acehtt => {chatte}
        hnostyz => {zythons}
        hmtuyz => {zythum}
        hmstuyz => {zythums}
        aeips => {pesai - épais - sépia}
        aegnors => {oranges - rongeas}
        
        
        mot à remettre en ordre (Q)uitter : pasei
        les mots sont ['pesai', 'épais', 'sépia']
        
        
        mot à remettre en ordre (Q)uitter : tata
        pas d'occurences
        
        
        mot à remettre en ordre (Q)uitter : oranges
        les mots sont ['oranges', 'rongeas']
        
        
        mot à remettre en ordre (Q)uitter : 


        1. Contributeur
          bonjour Whismeril,
          je pense que tu as créé une liste, pas un dictionnaire.
          cela empêche Python d'utiliser les clés pour faire une recherche très rapide.
        2. Contributeur
          @yg_beVariante avec dictionnaire:
          from unidecode import unidecode
          
          class Dictionnaire:
               
              def __init__(self,  mot):
                  self.lesMots = []
                  self.ajouteMot(mot)
                  
              def ajouteMot(self, mot):
                  self.lesMots.append(mot)
          
              def __str__(self):
                  return "{" + " - ".join(self.lesMots) + "}"
              
          def CreerDictionnaire(Mots):
              dico = {}
              for mot in Mots:
                  cle = "".join(sorted(unidecode(mot)))
                  if cle in dico.keys():
                      dico[cle].ajouteMot(mot)
                  else:
                      dico[cle]=Dictionnaire(mot)
              return dico
          
          def ChercheMot(lettres, dico):
              cle = "".join(sorted(unidecode(lettres)))
              if cle in dico.keys():
                  print("les mots sont", dico[cle].lesMots)
              else:
                  print("pas d'occurences")
                  
          wordstring = """abricot
          chat
          chatte
          zythons
          zythum
          zythums
          pesai
          épais
          sépia
          oranges
          rongeas"""
          
          wordlistfix = wordstring.splitlines()
          print("La liste de mots", wordlistfix)
          
          dico = CreerDictionnaire(wordlistfix)
          print("Le dictionnaire")
          for d in dico.keys():
              print(d,"==>",dico[d])
          
          
          rep = "Q"
          
          while(True):
              mixed_word = input("\nmot à remettre en ordre (Q)uitter : ")
              if(mixed_word in ['q','Q']): break
              ChercheMot(mixed_word, dico)
          
          
        3. @yg_beEn effet, c'est mon manque de maitrise en Python qui me fait patachonner.
          Merci
      3. Comme ça, alors (j'ai ajouté 1 mot avec accent) :
        Il faut installer unidecode d'abord

        from unidecode import unidecode
        
        dico = ['abricot', 'chat', 'oranges', 'onagres', 'organes', 'rageons', 'épais', 'zython']
        dico_no_accents = [unidecode(s) for s in dico]
        print(dico_no_accents)
        
        while(True):
            mixed_word = input("\nmot à remettre en ordre (Q)uitter : ")
            if(mixed_word in ['q','Q']): break
        
            mixed_word_no_accents = unidecode(mixed_word)
            mixed_word_a = ''.join(sorted(mixed_word_no_accents))
        
            found = False
            for word in dico_no_accents:
                word_a = ''.join(sorted(word))
                if(word_a == mixed_word_a):
                    found = True
                    print('Trouvé : ', word)
        
            if(not found): print(mixed_word,'non trouvé ...')
        1. Salut, sauf que là ça va te dire, j’ai trouvé epais alors que le vrai mot c’est épais.

          Dans le code posté à 1h18 à la ligne 25, il faut dire que piece vaut word sans accent et ça marche.

          Ou alors, dans ton concept, il faut créer un tuple pour chaque entrée du dictionnaire. Un peu comme l’a proposé yg_be.
          D’ailleurs sont idée de créer un dictionnary avec comme clé les lettres sans diacritiques dans l’ordre alphabétique pour chaque mot sera je pense le plus rapide en cas de recherche multiple.
      4. Bonjour

        Tout marche trés bien, mais il subsiste tout de même 1 seul, le seul et ultime problème : dés qu'il s'agit de mot comportant des accents, comme "è", "é", "à", "î", ô, â, ï,.... alors le code ne retourne rien, mème pour les mots très simple.

        C'est parce que quand tu cherche "e", ça n'est ni "é" ni "è" ni "ê", pour l'ordinateur se sont 4 caractères différents, plus précisément, ce sont 4 "e" dont 3 avec un signe diacritique, il y a aussi le ç ou la ñ comme cas connu.

        Pour retourner les possibilités quelque soit les signes diacritique, il "suffit" de faire les recherches sur le caractère de base.
        https://stackoverflow.com/questions/48445459/removing-diacritical-marks-using-python
        1. Bonjour patpouf,

          Encore plus court et plus concis:

          dico = ['abricot', 'chat', 'oranges', 'onagres', 'organes', 'rageons', 'zython']
          print(dico)
          
          while(True):
              mixed_word = input("\nmot à remettre en ordre (Q)uitter : ")
              if(mixed_word in ['q','Q']): break
          
              mixed_word_a = ''.join(sorted(mixed_word))
          
              found = False
              for word in dico:
                  word_a = ''.join(sorted(word))
                  if(word_a == mixed_word_a):
                      found = True
                      print('Trouvé : ', word)
          
              if(not found): print(mixed_word,'non trouvé ...')
          


          1. J'ai enfin réussi à faire un code qui fonctionne parfaitement pour les mots de toutes longueurs:

            zython
            zythons
            zythum
            zythums"""
            
            def dellettre(string, lettre):
                newword = ""
                ind = string.find(lettre)
                for index in range(len(string)):
                    if index != ind:
                        newword = newword + string[index]
                return(newword)
            
            interwordlist = wordstring.splitlines()
            wordlistfix = []
            for line in interwordlist:
                pureword = str(line.strip())
                wordlistfix.append(pureword)
            
            while(True):
                badword = input("mot à remettre en ordre : ")
                selectword = []
                for word in wordlistfix:
                    if(len(word) == len(badword)):
                        piece = word
                        longueur = 0
                        for lettre in badword:
                            if lettre in piece:
                                longueur = longueur + 1
                                piece = dellettre(piece, lettre)
                            else:
                                break
                        if longueur == len(badword):
                            selectword.append(word)
                    else:
                        pass
                for mot in selectword:
                    print(mot)
            


            Voici un exemple de son fonctionnement :

            mot à remettre en ordre : ogrnaes
            onagres
            oranges
            organes
            rageons
            rongeas
            songera

            Donc il fonctionne bien, il me donne bien toutes les olutions possibles, il fonctionne aussi avec les longs mots comme "hermaphrodite", "hippopotame", "thermodynamique".

            Tout marche trés bien, mais il subsiste tout de même 1 seul, le seul et ultime problème : dés qu'il s'agit de mot comportant des accents, comme "è", "é", "à", "î", ô, â, ï,.... alors le code ne retourne rien, mème pour les mots très simple. Donc là, je me pose la question de savoir si c est encore un erreur dans le code, ce qui me parrait bizarre car ça fonctionne parfaitement pour tous les mots, même long, qui m'ont pas de lettre avec des accent. Ou alors, est-ce peut etre un problème d'encodage ou un problème lié à l'interprêtation des accents par python.

            Pourtant, lorsque je fais :
            string = éléphant
            print(string.find("é"))

            celà me renvoie pourtant bien =>0, donc .find detecte bien les accents. L'erreur est donc ailleur, mais je ne sais pas où...

            Svp auriez vous une idée ?
            1. Contributeur
              Moi je ferais ainsi:
              1) associer à chaque mot du dictionnaire une clé, chaine de caractères avec les lettres du mot, triées par ordre alphabétique
              2) stocker cela dans une base de données sqlite, ou dans une structure dans un fichier, triée par la clé

              Quand tu dois retrouver un mot à partir de lettres dans le mauvais ordre, tu fais une recherche, puisque tu connais la clé exacte à chercher.
              1. Contributeur
                exemple:
                import sqlite3
                wordstring = """abricot
                chat
                chatte
                zythons
                zythum
                zythums"""
                def trielettres (m):
                    return "".join(sorted(m))
                conn = sqlite3.connect('dico.db')
                curs=conn.cursor()
                # sql="CREATE TABLE dico(mot text, cle text)"
                # curs.execute(sql)
                # sql="CREATE INDEX i_cle ON dico(cle)"
                # curs.execute(sql)
                wordlistfix = wordstring.splitlines()
                sql="DELETE FROM dico"
                curs.execute(sql)
                for word in wordlistfix:
                    sql="INSERT INTO dico (mot,cle) VALUES('" + word + "','"+ trielettres(word) +"')"
                    curs.execute(sql)
                conn.commit()
                while(True):
                    mixed_word = input("\nmot à remettre en ordre (Q)uitter : ")
                    if(mixed_word in ['q','Q']): break
                    sql="SELECT mot FROM dico WHERE cle='" + trielettres(mixed_word) + "'"
                    curs.execute(sql)
                    recs=curs.fetchall()
                    for rec in recs:
                        print(rec[0])
            2. Ah oui, j'allais oublier, la seule chose qui ne fo ctionne pas dans le code que vous m'avez envoyé, c'est la mise à 0 de la variable longueur. Par chance, votre code fonctionne pour la liste que vous avez utilisée car "chat" et le seul mot pour lequel la variable longueur a été utilisée, vu que "chat" est le seul mot de votre liste qui contient le meme nombre de caractères que "hcat". Mais si vous aviez mis un autre mot de d'autres mots valables pour "hcat", imaginons que dans votre liste vous auriez mis le mot "cath", votre code ne l'aurait pas trouvé, car votre variable longueur n'aurait pas été remise à 0, car vous n'avez pas mis (longueur = 0) au bon endroit. J'ai juste corrigé ça en insérant (longueur = 0) à l'interieur de la premiere boucle for, mais à l'extérieur de la 2ème. Et la votre algorithme devient juste. Sinon merci, votre méthode en utilisant la variable longeur est astucieuse, j'y avais pas pensé.
              1. Hé oui, mon code est très simple et très court, et il fait le job demandé

                Tu remarqueras que, lorsque je boucle sur les mots de wordlistfix, je commence par tester si le mot mélangé

                a la même longueur que le mot de wordlistfix, sinon, ce n'est pas la peine d'analyser plus loin

                C'est bien la 1ere chose à faire ...
                1. Contributeur
                  La première chose à faire, c'est une fois pour toutes, de trier les mots du dictionnaire, de façon à pouvoir faire une recherche dichotomique.
              2. Rebonjour, oui, klmerci beaucoup, c est en effet la méthode que je voulais avec laquelle je voulais refaire mon code, en testant pour chaque mot le nb de lettre, et il marche effectivement bien, il n'y a pas de problemes avec les doublons. Je suis en train de le perfectionner en ajoutant des options comme ignorer les accents, ou choisir le nombre de lettres minimum à utiliser. Je me pose maintenant si il existe de meme, un algorithme simple permettant de faire la meme chose avec des phrases, (les lettres de toute la phrase sont melangées), mais sans pour autant avoi recour au bruteforce, ni faire de liste de phrases, mais uniquement en utilisant la liste de mots francais. Ce problème là me parrait déjà plus compliqué ètant donné qu'avec une phrase comprenant beaucoup de caracteres et/ou beaucoup de mots, on peut avoir des milliers de possibilites de phrases. Mais deja il faudrait trouver un algo permettant de toutes les trouver sans faire de bruteforce (ou alors une bruteforce dont le temps de calcul ne serait pas exponentiel en fonction de la longueur de la phrase ou du nombre de mots dans la phrase).

                Sinon, merci beaucoup pour vos conseils, je me complique parfois trop la vie en utilisant python.
                1. Ben non, wordlistfix est initialisée une seule fois avant le while

                  En faisant comme ça, ca marche:

                  wordstring = """abricot
                  chat
                  chatte
                  zythons
                  zythum
                  zythums"""
                  
                  wordlistfix = wordstring.splitlines()
                  print(wordlistfix)
                  
                  while(True):
                      mixed_word = input("\nmot à remettre en ordre (Q)uitter : ")
                      if(mixed_word in ['q','Q']): break
                      longueur = 0
                  
                      for word in wordlistfix:
                          if(len(word) == len(mixed_word)):
                              for lettre in mixed_word:
                                  if(lettre in word): longueur += 1
                  
                              if(len(word) == longueur):
                                  print('\nTrouvé : {}'.format(word))
                                  break
                              else:
                                  longueur = 0
                  
                      if(longueur == 0): print('\nRien trouvé !')
                  




                  1. Oui, majs normallement on est forcement dans un cas ou dans l'autre, car soit la liste est vide (len(...)<1:), soit la liste n'est pas vide (else:) et dans ce cas la boucle for continue pour la lettre suivante. Je pense que je vais repenser mon code, et au lieu de faire (pour chaque lettre de badword, lettre est il dans {wordlist[indexlist]} ) je vais plutot faire l'inverse, c est a dire: vérifier si pour chaque mot de la liste, le mot contient il chaque lettre de badword), en gros je vais essayer de refaire un code mais en inversant les 2 premiere boucles for. Je pense que avec cette methode ce serait plus simple car il n'y aura pas besoin de mettre à jour wordindex pour chaque lettre. Je réessaie ce soir, et si je réussis, je partage le code, si ça vous interresse..

                    Merci des conseils, j'avais effectivement pu penser à une break pour sortir de la loupe, mais l'avantage de rester dans la boucle while, c'est que on peut utiliser le code plusieurs fois, sans avoir à regénérer wordlistfix à chaque fois, car la liste est quand meme assez longue (300000 mots).

                    Je vous redis si j'atteints quelque chose ce soir
                    • 1
                    • 2