0
votes

Ne peut pas enlever les voyelles venant après des consonnes dans une chaîne

J'essayais de retirer les voyelles venant après des consonnes, mais le code supprime toutes les voyelles.

Je ne comprends pas pourquoi il supprimerait "AAA" code>. P>

def kk(phrase):
    v = ['a', 'e', 'i', 'o', 'u', 'y']
    for i in phrase:
        if i not in v and phrase[phrase.index(i)+1] in v:
            phrase=phrase.replace(phrase[phrase.index(i)+1],"")
    return phrase
print (kk("aaa bo cy da eee fe"))


1 commentaires

Votre logique est claire: si une voyelle apparaît après une consonne, vous supprimez toutes les occurrences de cette voyelle de la phrase complète. Vous devez supprimer seulement celui-ci.


5 Réponses :


1
votes

Méthode 1:

def kk(phrase):
    v = set('aeiou')
    i = 0
    while i < len(phrase)-1:
        if phrase[i] not in v and phrase[i+1] in v: 
            phrase = phrase[:i+1] + phrase[i+2:]
        i += 1
    return phrase


1 commentaires

@Tomerikoo: Merci pour le BugReport. Fixé



-1
votes

D'accord, alors pourquoi cela ne fonctionne pas est dû à la fonction index utilisé avec remplacer . La fonction index retournera l'index de la première occurrence de la chaîne, c'est pourquoi, dans l'exemple mentionné, il renvoie 0 au lieu de l'index de A à venir après b .

Un moyen de résoudre ce problème: xxx


6 commentaires

De plus, le code d'origine jette une erreur d'index hors de portée chaque fois que le dernier caractère n'est pas dans v


Je suppose que vous vouliez dire une liste, pas un tableau. Et pourquoi le code suppose pour obtenir cela?


@Tomerikoo Oui, j'ai signé la liste. Je suis nouveau à Python alors s'habituer à la terminologie. La dernière solution que j'ai proposée n'était pas la meilleure donc oui ..


Votre code soulève une exception. S'il vous plaît, testez-le avant de poster. Votre problème est que vous changez la chaîne phrase tout en bouclant sur ses éléments d'origine afin que vous obteniez une inadéquation d'indices


@Tomerikoo j'ai vérifié le code. Il n'amène aucune exception pour moi


essayez de faire imprimer (kk ("aaa bo cy da eee fe")) comme op et dites-moi ce que vous obtenez



1
votes

Votre problème principal est que remplacer remplace toutes les occurrences de la sous-chaîne passée, de sorte que chaque fois que vous rencontrez un 'a' par exemple, vous les supprimerez tous:

second problème, Même si vous avez corrigé le problème remplacer est que vous utilisez index , qui renvoie le premier index trouvé. Encore une fois, par exemple lors de la pièce 'da' de votre chaîne, l'index est renvoyé pour le 'A' sera effectivement 0 .

Pour surmonter ceci, vous souhaitez d'abord itérer les indices, créer une nouvelle variable pour le résultat et utiliser la tranchée. Quelque chose comme: xxx

et ceci donne: xxx

Notez que un E était également Supprimé en raison de l'espace, cela peut être facilement manipulé


0 commentaires

0
votes

une solution utilisant itheroTools.groupby code> et ithertools.chain code>: xxx pré>

impression: p> xxx


Plus de tests: P>

aaax
aaaxx
a aax


0 commentaires

1
votes

Pour cette tâche, l'expression régulière est le meilleur choix:

import re

s = "aaa bo cy da eee fe"
result = re.sub(r"(?<=[^aeiouy ])[aeiouy]", "", s, flags=re.I)


0 commentaires