2014-09-09 6 views
-3

Что не так с этим кодом? Цель состоит в том, чтобы проверить погоду введенная строка содержит гласные и удалить ихПопытка удалить гласные строки из строки

Вот код:

def anti_vowel(text): 
    text = str(text) 
    vowel = "aeiouAEIOU" 
    for i in text: 
     for i in vowel.lower(): 
      text = text.replace('i',' ') 
     for i in vowel.upper(): 
      text = text.replace('i',' ') 
    return text 

Это урок на Codecademy

+0

Вы отметили это с помощью Python 3, но исходная ссылка на Code Academy использует их сеанс онлайн-кода Python 2. Мой ответ 'str.translate()' должен быть скорректирован для Python 2, поэтому убедитесь, что у вас есть правильный тег. Для справок в будущем: всегда включайте свой код * здесь *, а не ссылку, и включайте введенный вами вход, полученный результат и то, что вы ожидали получить вместо этого. –

+0

''' .join ([e для e в tgt, если e.lower() не в 'aeiou'])' – dawg

ответ

3

Вы пытаетесь заменить строку со значением'i', а не содержание переменной i.

Ваш код также очень неэффективен; вам не нужно перебирать каждый символ в text; достаточно петли над vowel. Поскольку вы уже включаете в себя как верхнюю, так и нижнюю регистры, две петли над версиями с нижней и верхней строками по существу проверяют для каждого гласного 4 раза.

Ниже будет достаточно:

def anti_vowel(text): 
    text = str(text) 
    vowel = "aeiouAEIOU" 
    for i in vowel: 
     text = text.replace(i,' ') 
    return text 

Вы также заменить гласные с пробелами, а не только удалять их.

Самый быстрый способ удалить (а не заменить) все гласные бы использовать str.translate():

def anti_vowel(text): 
    return text.translate(text.maketrans('', '', 'aeiouAEIOU')) 

str.maketrans() static method производит отображение, которое будет удалить все символы, названные в 3-й аргумент.

+0

Было бы интересно увидеть бросок между 'maketrans' и' text.translate (dict.fromkeys (map (ord, 'AEIOUaeiou))) ' –

+0

@JonClements: это действительно должно быть сделано вместо аргумента функции, но я не хотел слишком сильно нажимать на конверт. 'def anti_vowel (текст, _mapping = str.maketrans ('', '', 'aeiouAEIOU')): return text.translate (_mapping)'. –

+0

Действительно ... все, что нам не хватает сейчас, это 're.sub ('[aeiou]', '', text, flags = RE.I)' или что-то - тогда у нас может быть канонический ответ на вопрос, который получает спросил несколько раз каждую неделю ... –

Смежные вопросы