Erreur fonction filtrage mot

Résolu
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

5 réponses

  1. Contributeur Ambassadeur
    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
    1. 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
      1. Modérateur
        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
        1. Contributeur Ambassadeur
          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
      2. 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