2016-06-16 4 views
0

Я использую курс начинающего программиста python codeacademy. Я должен определить функцию, которая берет строку и возвращает ее без гласных. Моя функция удаляет некоторые гласные, но обычно не все, меняясь в зависимости от конкретной строки и без четкой картины. Мой код это ниже, пожалуйста, посмотрите на него, чтобы увидеть, если вы в состоянии найти свою ошибку:Обучение Python; не знаю, почему моя функция работает ненадлежащим образом.

def anti_vowel(text): 
    a = len(text) 
    b = 0 
    letters = [] 
    while a > 0: 
     letters.append(text[b]) 
     a -= 1 
     b += 1 
    for item in letters: 
     if item in "aeiouAEIOU": 
      letters.remove(item) 
    final = "" 
    return final.join(letters) 

ответ

3

Проблемы у вас есть то, что вы итерация своего списка letters и изменить его в то же время. Это заставляет итерацию пропускать определенные буквы на входе без их проверки.

Например, если ваша строка text была 'aex', то список letters стал бы ['a', 'e', 'x']. Когда вы перебираете его, item будет 'a' на первом проходе, и letters.remove('a') будет вызван. Это изменило бы letters на ['e', 'x']. Но итерация списка работает по индексу, поэтому следующий проход через цикл не будет иметь item, установленный в 'e', но вместо этого в следующий индекс, 'x', который не будет удален, так как он не является гласным.

Чтобы код работал, вам нужно изменить его логику. Либо перебирайте копию списка, итерации в обратном направлении, либо создайте новый список с нужными элементами, а не удаляйте нежелательные.

+0

Хороший ответ! Обратите внимание, что исходная текстовая строка должна читать 'aex' – Mark

+0

. Кричит, да, я переключился с' aab'' на 'aex'', чтобы сделать разницу между гласными более четкими. Я отредактировал, чтобы исправить слева над 'aab'. – Blckknght

2

Вы всегда будете получать неожиданные результаты, если вы измените то, что вы зацикливаете, внутри цикла - и это объясняет, почему вы получаете странные значения из своей функции.

В вашем цикле for вы изменяете объект, который должен быть зациклен; вместо этого создайте новый объект.

Вот один из способов это сделать:

def anti_vowel(text): 
    results = [] # This is your new object 
    for character in text: # Loop over each character 
     # Convert the character to lower case, and if it is NOT 
     # a vowel, add it to return list. 
     if not character.lower() in "aeiou": 
      results.append(character) 
    return ''.join(results) # convert the list back to a string, and return it. 
1

Я думаю @Blckknght ударил гвоздь по голове. Если бы я представил с этой проблемой, я бы попробовать что-то вроде этого:

def anti_vowel(text): 
    no_vowels = '' 
    vowels = 'aeiouAEIOU' 
    for a in text: 
     if a not in vowels: 
      no_vowels += a 

    return no_vowels 
0

Если вы попытаетесь его со строкой, содержащей последовательные a символ (или любой гласной), вы поймете, почему.

Фактический вызов remove изменяет список, поэтому итератор над этим списком будет более правильным.

Есть много способов исправить это, но, возможно, лучше всего не использовать этот метод вообще. Это не имеет никакого смысла, чтобы сделать список, который вы затем удалить символы из когда вы можете просто создать новую строку, вдоль линий:

def anti_vowel (str): 
    set ret_str to "" 
    for ch as each character in str: 
     if ch is not a vowel: 
      append ch to ret_str 
    return ret_str 

Кстати, не путайте, что для Python, он должен быть псевдокодом, чтобы проиллюстрировать, как это сделать. Это просто случается, что, если вы игнорируете все темные уголки Python, это делает идеальный язык псевдо-код :-)

Поскольку это почти наверняка классное, это вашей работы, чтобы превратить это в вашем язык по выбору ,

0

не уверен, как именно ваша функция должна работать, поскольку с ней связано немало ошибок. Я проведу вас через решение, которое я придумал.

def anti_vowel(text): 

    final = '' 

    for letter in text: 
     for vowel in 'aeiouAEIOU': 
      if (letter == vowel): 
       letter = "" 
     final += letter 

    print final   
    return final 
anti_vowel('AEIOUaeiou qwertyuiopasdfghjklzxcvbnm') 

Инициализируем функцию и вызвать пройденному тексту Param

def anti_vowel(text): 

Мы будем инициализировать окончательный как пустая строка

final = '' 

Мы будем смотреть на все буквы в тексте прошли в

for letter in text: 

Каждый раз, когда мы делаем это, мы будем смотреть на все возможные гласные

 def anti_vowel(text): 

Если какой-либо из них соответствует букве мы проверяем, мы сделаем это письмо пустая строка, чтобы избавиться от него.

  if (letter == vowel): 
       letter = "" 

После того, как мы проверили его на каждой гласной, если это гласный, то это будет пустая строка в этой точке. Если нет, это будет строка, содержащая согласный. Мы добавим это значение в окончательную строку

 final += letter 

Распечатайте результат после завершения всех проверок и замены.

print final 

Возвращает результат

return final 

Проходя этот

anti_vowel('AEIOUaeiou qwertyuiopasdfghjklzxcvbnm') 

Вернется это

qwrtypsdfghjklzxcvbnm

0

Добавление к тому, что остальные уже сай d, что вы не должны изменять Iterable когда цикл через него, вот мой сокращенный вариант всего кода:

def anti_vowel(text): 
    return text.translate(None, "aeiouAEIOU") 

Python уже имеет «встроенный текстовый съемник», вы можете прочитать больше о переводить here ,

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