Почему моя функция частично выполняет то, что она должна делать?

#python #python-3.x

#python #python-3.x

Вопрос:

Итак, я пытаюсь написать функцию Python 3 для вызова, которая принимает строку, удаляет гласные и возвращает ее без гласных. Я написал приведенный ниже код, но, похоже, он только частично удаляет гласные, оставляя некоторые нетронутыми.

 def remove_vowels(string):
    vowels = ['a','e','i','o','u']
    newstring = ""

    for letter in string:
        if letter in vowels:
            newstring = string.replace(letter,””)
        else:
             pass

    return newstring
  

Комментарии:

1. Можете ли вы также поделиться выводом

2. Эта проверка совершенно бессмысленна if letter in vowels:

3. Имеет ли ваша строка смешанный корпус?

4. Я исправил отступ в вашей публикации кода. В следующий раз, пожалуйста, не забудьте выбрать весь блок кода, прежде чем нажимать {} кнопку.

5. Тщательно подумайте о своей логике. Что вы ожидаете newstring newstring = string.replace(letter,””) , когда произойдет в первый раз? Хорошо, а как насчет второго раза? Подсказка: что это за вещь, которую вы вызываете .replace во второй раз? Изменилось ли это с первого раза?

Ответ №1:

Ваш исходный код на python со следующим вводом

 print(remove_vowels("The quick brown fox jumps over the lazy dog"))
  

возвращает «Быстрый переход fx к ленивому dg»

Причина, по которой это удаляет только гласную «o», заключается в том, что вы перебираете каждую гласную и обновляете новую строку до переданной строки минус текущая гласная, которую вы включили. Так, например, в первый раз в вашем цикле for ваша переменная «newstring» будет:

 The quick brown fox jumps over the lzy dog
  

Тогда на следующей итерации вашей переменной «newstring» будет установлено значение

 Th quick brown fox jumps ovr th lazy dog
  

И так далее, и так далее. Причина, по которой в моем примере удаляются только o, заключается в том, что нет U для замены, поэтому метод замены строки никогда не вызывается, оставляя переменные «newstring» без o.

Чтобы исправить это, вам нужно просто полностью удалить newstring и обновить исходную строку, поскольку это ее собственная переменная, и технически это будет работать как есть.

Хотя это можно сжать и переработать для повышения производительности довольно легко, поскольку на самом деле вам вообще не нужно перебирать вашу строку (и вам не нужен какой-либо тип новой строки, поскольку переданная строка — это ее собственная переменная, которую вы можете обновить), поскольку pythons «String.replace» заменит ВСЕвхождения предоставленной подстроки и возвращает результирующую строку (если вы не указываете максимальное количество вхождений).

Работает следующий код ниже

 def remove_vowels(string):
    vowels = 'aeiou'
    for vowel in vowels: string = string.replace(vowel,'')
    return string

print(remove_vowels("The quick brown fox jumps over the lazy dog"))
  

и возвращает «Th qck brwn fx jmps vr th lzy dg»

Комментарии:

1. В результате для первого примера удаляются только буквы o, потому что o является последней гласной в исходной строке (а не потому, что нет u для замены).

Ответ №2:

Это потому, что вы настраиваете newstring другой вывод строки на каждой итерации цикла newstring = string.replace("")

Вам нужно установить newstring замененную строку, а затем запустить следующую итерацию replace on newstring . Вот так:

 def remove_vowels(string):
    vowels = ['a','e','i','o','u']
    newstring = string

    for letter in newstring:
        if letter in vowels:
            newstring = newstring.replace(letter , "")

    return newstring

string = "stack overflow"
print("Original string = ", string)
print("String with vowels removed = ", remove_vowels(string))
  

Вывод:

 Original string = stack overflow
String with vowels removed = stck vrflw
  

Ответ №3:

Альтернативное короткое решение с пониманием списка:

 def remove_vowels(string):
    not_vowels = [letter for letter in string if letter not in 'aeiou']
    return ''.join(not_vowels)
  

Ответ №4:

Внесите следующие изменения в свой код, и он должен работать как шарм 🙂

 def remove_vowels(string):
vowels = 'aeiou'

for letter in string:
    if letter in vowels:
        string = string.replace(letter," ")
    else:
         pass

return string
  

Ответ №5:

Вы каждый раз заменяете символ в исходной строке, но исходная строка никогда не изменяется в соответствии с текущей логикой (за исключением последнего цикла).

попробуйте это внутри условия IF newstring = newstring.replace(letter,"")

(также инициализируйте newstring = string перед циклом for)

Ответ №6:

Ваш код имеет несколько дефектов:

  • Вы обновляете new_string с string помощью , которая не изменяется, и это приводит к удалению только последней гласной в списке.
  • Вам не нужно else: pass , все в порядке только с предложением if . Это else: pass избыточно.
  • Вы перебираете буквы в string , что не самый быстрый способ сделать что-то, кроме того, это создаст всевозможные странные ошибки, если ваш код меняется string . Вы можете выбить for i in new_string:if i in vowels с помощью for i in vowels
  • Это vowels не обязательно должен быть список, если вы только перебираете его.Попробуйте a tuple или a str для большей эффективности.

Общее исправление:

 def remove_vowels(string):
    vowels = ('a','e','i','o','u')
    newstring = string
    for letter in vowels:
        newstring = newstring.replace(letter,””)
    return newstring
  

или:

 def remove_vowels(string):
    vowels = ('a','e','i','o','u')
    for letter in vowels:
        string = string.replace(letter,””)
    return string