Probleme de liste python
Utilisateur anonyme -
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
- Probleme de liste python
- Liste déroulante excel - Guide
- Liste code ascii - Guide
- Liste déroulante en cascade - Guide
- Liste de diffusion whatsapp - Guide
- Liste des appareils connectés - Guide
31 réponses
- 1
- 2
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.
Pour que ton code soit plus lisible, affiche-le avec les balises de code, mode d'emploi:
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
Ca doit ressembler à ça, une fois le message validé:
while True:
badword = str(input("mot à remettre en ordre : "))
wordlist = wordlistfix
Ceci dit, pour retrouver toutes les anagrammes d'un mot, dans un 1er temps, tu peux faire ça:
import itertools as it
word = input('Mot : ')
anag = set("".join(e) for e in it.permutations(word, len(word)))
for el in anag: print(el)
Et dans un 2eme temps, tu cherches le mot valide
10 lettres maxi, 300000 combinaisons en 10 secondes...
sachant qu'avec set(), j'élimine quand même les doublons
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionmot à remettre en ordre : hcat
anes
eais
eait
eant
eât
eée
eés
èes
eeur
eiez
eons
evai
evan
evâ
roma
moai
moan
moâ
moen
niar
rone
taai
taas
taé
taer
taes
taez
urue
vaî
b̂ai
b̂an
b̂â
b̂en
boai
boas
boé
boer
boes
boez
bêi
bên
bê̂
bioi
bios
blne
blni
boui
boun
boû
Voici ce que j'obtiens en lançant mon code ????♂️
résultat avec ta nouvelle liste:
Au fait len(wordlistfix) est forcément un integer donc pas besoin de int(len(...
input saisi par défaut une string, donc pas besoin de badword = str(input(
badword = input("\nmot à remettre en ordre : (Q = quitter) : ")
if(badword in 'Qq'): break
"tu reviens au debut de la boucle while sans avoir affiché le message de print"
Ok mais on ne print que si ces 2 conditions sont vraies:
if len(selectindex) < 1:
print("aucun mot trouvé")
if len(wordlistfix[indexfinal]) == len(badword):
print(" ", wordlistfix[indexfinal])
Si on ne tombe dans aucun de ces 2 cas, on ne sort rien ...
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
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é !')
Sinon, merci beaucoup pour vos conseils, je me complique parfois trop la vie en utilisant python.
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) 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.
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])
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 ?
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
- 2
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: continueVoila, normallement le code devrait s afficher correctement. Sinon, à propos de l'idée que vous m avez proposée, de re hercher tous les anagrames d'un mot, ce n'est pas possible, car par exemple pour un mot de 25 lettres comme "anticonstitutionnellement" il faudrait essayer 25! Possibilité ce qui fait environ 1,55*10²⁵, aucun ordinateur ne serait assez puissant pour essayer toutes les possibilités en un temps raisonnable. C'est pour cela que j'utioise ma methode de selectionner les mots du dictionnaire qui contiennent les meme lettres que le mot dans le mauvais ordre, ce qui a un temps de calcul non-exponentiel en tout cas, donc assez rapide peu importe la longueur du mot.