Erreur fonction filtrage mot

Résolu/Fermé
raptor - 21 mai 2022 à 22:21
yg_be Messages postés 23352 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 novembre 2024 - 22 mai 2022 à 11:28
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 23352 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 novembre 2024 Ambassadeur 1 554
22 mai 2022 à 11:28
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 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
21 mai 2022 à 23:26
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
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 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
22 mai 2022 à 00:11
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 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
22 mai 2022 à 00:13
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 23352 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 27 novembre 2024 1 554
Modifié le 22 mai 2022 à 09:52
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
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