#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
не обязательно должен быть список, если вы только перебираете его.Попробуйте atuple
или astr
для большей эффективности.
Общее исправление:
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