Je dois saisir une chaîne, supprimer tous les espaces et imprimer la chaîne sans voyelles. Je dois également imprimer une chaîne de toutes les voyelles supprimées.

Je suis devenu très proche de cet objectif, mais pour une raison quelconque, lorsque j'essaie de supprimer toutes les voyelles, il n'enlèvera pas deux voyelles d'affilée. Pourquoi est-ce? Veuillez donner des réponses pour ce bloc de code spécifique, car les solutions m'ont aidé à résoudre le défi mais pas mon problème spécifique

# first define our function
def disemvowel(words):
    # separate the sentence into separate letters in a list
    no_v = list(words.lower().replace(" ", ""))
    print no_v
    # create an empty list for all vowels
    v = []
    # assign the number 0 to a
    a = 0

    for l in no_v:
        # if a letter in the list is a vowel:
        if l == "a" or l == "e" or l == "i" or l == "o" or l == "u":
            # add it to the vowel list
            v.append(l)
            #print v
            # delete it from the original list with a
            del no_v[a]
            print no_v
        # increment a by 1, in order to keep a's position in the list moving
        else:
            a += 1

    # print both lists with all spaces removed, joined together
    print "".join(no_v)
    print "".join(v)

disemvowel(raw_input(""))
0
Myles 10 mars 2016 à 08:21

3 réponses

Meilleure réponse

Erreurs

Il existe donc de nombreuses autres, et peut-être de meilleures approches pour résoudre ce problème. Mais comme vous l'avez mentionné, je viens de parler de vos échecs ou de ce que vous pouvez faire de mieux.

1. Faites une liste de mots d'entrée

Il y a beaucoup de choses que vous pourriez faire mieux

no_v = list(words.lower().replace(" ", ""))

Vous ne remplacez pas tous les espaces à cause de " " -> " " alors utilisez-le à la place

no_v = list(words.lower().translate( None, string.whitespace))

2. Remplacer la boucle par la boucle while

Parce que si vous supprimez un élément de la liste, le for l in no_v: ira à la position suivante. Mais à cause de la suppression, vous avez besoin de la même position, pour supprimer toutes les voyelles dans no_v et les mettre dans v.

    while a < len(no_v):
      l = no_v[a]

3. Renvoyer les valeurs

Parce que c'est une fonction, n'imprimez pas les valeurs, renvoyez-les simplement. Dans ce cas, remplacez le print no_v print v et retournez-les et imprimez-les.

return (no_v,v) # returning both lists as tuple

4. Pas une erreur mais préparez-vous à python 3.x

Essayez simplement d'utiliser toujours print("Have a nice day") au lieu de print "Have a nice day"

Votre algorithme sans les erreurs

Votre algorithme ressemble maintenant à ceci

import string
def disemvowel(words):
    no_v = list(words.lower().translate( None, string.whitespace))
    v = []
    a = 0
    while a < len(no_v):
        l = no_v[a]
        if l == "a" or l == "e" or l == "i" or l == "o" or l == "u":
            v.append(l)
            del no_v[a]
        else:
            a += 1
    return ("".join(no_v),"".join(v))

print(disemvowel("Stackoverflow is cool  !"))

Sortie

Pour la phrase Stackoverflow is cool !\n, elle génère

('stckvrflwscl!', 'aoeoioo')

Comment je ferais cela en python

Pas demandé mais je vous donne une solution que j'utiliserais probablement. Parce que cela a quelque chose à voir avec le remplacement de chaîne ou la correspondance, j'utiliserais simplement l'expression régulière.

def myDisemvowel(words):
    words = words.lower().translate( None, string.whitespace)
    nv = re.sub("[aeiou]*","", words)
    v = re.sub("[^a^e^i^o^u]*","", words)
    return (nv, v)

print(myDisemvowel("Stackoverflow is cool  !\n"))

J'utilise juste une expression régulière et pour la chaîne nv, je remplace simplement tous les voewls par une chaîne vide. Pour la chaîne de voyelles, je remplace simplement le groupe de toutes les voyelles non par une chaîne vide. Si vous écrivez ce compact, vous pouvez résoudre ce problème avec 2 lignes de code (en renvoyant simplement le remplacement)

Sortie

Pour la phrase Stackoverflow is cool !\n, elle génère

('stckvrflwscl!', 'aoeoioo')
0
Kordi 10 mars 2016 à 08:19

Vous modifiez no_v lors de l'itération. Ce serait beaucoup plus simple de faire deux nouvelles listes, une avec des voyelles et une sans.

Une autre option consiste à le convertir en une boucle while:

while a < len(no_v):
    l = no_v[a]

De cette façon, vous n'avez qu'une seule variable pour suivre votre place dans no_v au lieu des deux que vous avez actuellement.

0
Nathan Villaescusa 10 mars 2016 à 05:29

À des fins éducatives, tout cela peut être considérablement allégé.

def devowel(input_str, vowels="aeiou"):
  filtered_chars = [char for char in input_str 
                    if char.lower() not in vowels and not char.isspace()]
  return ''.join(filtered_chars)

assert devowel('big BOOM') == 'bgBM'

Pour vous aider à apprendre, procédez comme suit:

  • Définissez une fonction qui renvoie True si un caractère particulier doit être supprimé.
  • En utilisant cette fonction, parcourez les caractères de la chaîne d'entrée et ne laissez que des caractères éligibles.
  • Dans ce qui précède, évitez d'utiliser des index et len(), au lieu de parcourir les caractères, comme dans for char in input_str:.
  • En savoir plus sur la compréhension des listes.
  • (Points bonus :) Découvrez la fonction filter.
0
9000 10 mars 2016 à 05:34