J'essaie de programmer quelque chose qui filtrera toutes les voyelles d'une chaîne de texte et je ne sais pas pourquoi ma fonction ne fonctionne pas. Voici mon code

def anti_vowel(text):
 letters = text.split() #make a list of all the letters in the string
 index = 0 #for del
 for x in letters:
     if x == "a" or x == "A" or x == "u" or x == "U" or x == "i" or x == "I" or x == "o" or x == "O" or x == "e" or x == "E":
         del letters[index]
     index += 1 #to make the if-clause work
 return "".join(letters) #turn the edited list into a string

En itérant sur les lettres, la clause if doit être activée lorsque l'objet en lettres est une voyelle, n'est-ce pas? il devrait donc supprimer cet objet. Mais qu'est-ce que je fais mal?

1
pokemonfan 14 juil. 2015 à 20:14

5 réponses

Meilleure réponse

Votre code n'itère pas par des lettres, il itère par des mots. En effet, text.split() divise votre texte en list chaînes de "mots" séparées par des espaces.

Le problème suivant est que vous parcourez un list et supprimez des entrées. Muter un itérable tout en le parcourant est une cause courante de résultats étranges.

Au lieu de cela, faites quelque chose comme ceci:

def anti_vowel(text):
    return ''.join(filter(lambda x: x.lower() not in 'aeioe', text))

Résultat:

>>> anti_vowel('hi my name is joe')
'h my nm s j'
4
TigerhawkT3 14 juil. 2015 à 17:18

Je préfère l'approche d'Avinash, mais si vous voulez réparer votre implément. voici comment procéder:

def anti_vowel(text):
    letters = list(text)
    i = 0
    while i < len(letters):
        x = letters[i]
        if x in "aAeEiIoOuU":
            del letters[i]
        else:
            i += 1
    return "".join(letters)
2
alfasin 14 juil. 2015 à 17:49

J'utiliserais re.sub

re.sub(r'(?i)[AEIOU]', '', st)

Explication:

  • (?i) Le modificateur insensible à la casse permet de faire une correspondance insensible à la casse.
  • [AEIOU] correspond à n'importe quel caractère de la liste donnée. Puisque nous avons déjà ajouté le modificateur insensible à la casse, cela correspondrait aux voyelles majuscules et minuscules.
5
Avinash Raj 14 juil. 2015 à 17:26

Vous pouvez utiliser la compréhension de liste et créer quelque chose comme ça

def anti_vowel2(text):
    return "".join([x for x in text if x.lower() not in 'aeiou'])

print(anti_vowel2("test"))

Qui sort la chaîne tst

1
DJanssens 14 juil. 2015 à 18:28

''.join(c for c in text if c.lower() not in 'aeiou')

Cela utilise une expression de générateur pour regarder chaque lettre de la chaîne, et la conserver uniquement si ce n'est pas une voyelle (ses minuscules ne sont pas dans 'aeiou'), puis joint ces caractères valides.

1
iobender 14 juil. 2015 à 17:18