Erreur fonction filtrage mot

Résolu
raptor -  
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

J'essaye de coder une fonction qui prend une liste par exemple words = ['the','dog','got','a','bone'] et des lettres par exemple letters= 'ae' . La fonction doit me supprimer tous les mots de la liste qui n'ont pas une des lettres données. Dans notre cas la sortie est ['the', 'a', 'bone'].

j'ai coder la fonction suivante :

def filter_words(words, letters):
lst = [i for i in words]
for elem in letters:
for mot in words:
if elem not in mot:
lst.remove(mot)
return lst

je ne comprends pas pourquoi j'ai l'erreur suivante :

line 16, in filter_words
lst.remove(mot)
ValueError: list.remove(x): x not in list

pourriez vous m'expliquer l'erreur ?

Configuration: Windows / Firefox 100.0
A voir également:

5 réponses

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
L'erreur me semble normale. Pour comprendre, ajoute des print() dans ton code.

Pour ce que tu ne comprends pas: ajoute dans ta liste de mots un mot qui contient a et e, et tu auras aussi l'erreur.
1
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
Bonjour,

Déjà ..
En python, l'indentation étant primordiale ... merci de re poster ton code en utilisant les balises de code.
Explications disponibles ici : https://forums.commentcamarche.net/forum/affich-37598670-mise-en-forme-du-forum-et-des-fiches-pratiques-ccm#les-codes-sources

Ensuite, pourquoi utilises tu la variable lst ?
Ne peux tu pas directement faire le remove sur la variable words ?
0
raptor
 
def filter_words(words, letters):
    for elem in letters:
        for mot in words:
            if elem not in mot:
                words.remove(mot)
    return words



le code me retourne ['a'] au lieu de ['the', 'a', 'bone']
0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
C'est normal.
Il a retiré tous les mots qui ne contiennent pas la lettre a et tous les mots qui ne contiennent pas de e..
Une solution rapide que je vois serait d inverser tes deux boucles.
Pour chaque mot puis à l'intérieur pour chaque lettre
Dans ton if , tu mets une variable à true si la lettre n'est pas présente dans le mot.
À la fin de la boucle sur les lettres, tu regardes si la variable est toujoirs a true.
Si oui tu supprimes e mot.
Puis tu remets cette variable à false avant de passer au mois suivant..
0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
Sinon tu peux regarder comment faire une intersection entre deux listes
https://www.geeksforgeeks.org/python-intersection-two-lists/
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
bonjour,
Il n'a pas retiré tous les mots qui ne contiennent pas e, sinon il n'aurait pas gardé le mot "a".
Ce n'est pas une bonne idée de faire une itération sur une liste tout en supprimant des éléments de cette liste.
Il est préférable, soit de faire une itération sur une copie de la liste:
import copy
#...
for mot in copy.copy(words):
    #...
, soit de travailler avec un index, et de commencer par la fin, à condition d'utiliser l'index pour la suppression:
for x in range(len(words)-1,-1,-1):
            mot=words[x]
            #...
                   del words[x]
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
raptor
 
Bonjour,
C'est pour éviter ce problème d’itération sur une liste tout en supprimant des éléments de la liste que dans ma première fonction j'avais créer une deuxième liste sur laquelle je supprimais mes éléments.

def filter_words(words, letters):
    lst = [i for i in words]
    for elem in letters:
        for mot in words:
            if elem not in mot:
                lst.remove(mot)
    return lst


Mais j'obtiens une erreur line 13, in filter_words
lst.remove(mot)
ValueError: list.remove(x): x not in list

Ce que je ne comprends pas c'est ce qui je supprime le 'not' de 'il elem not in mot' ma fonction se lance et j'obtiens ['dog', 'got']
0