Строка заменяет печать слишком много экземпляров символа «е» - PullRequest
0 голосов
/ 11 февраля 2019

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

например: apple становится aaaappleeee

Работает для каждого гласного, кроме e , в котором повторяется e вопиющее количество раз.

Python 3. Я попытался поиграть с функцией замены, изменив значение замены на i+i+i+i, i*4, i(4), (i+i)*2, нокажется, ничего не помогает.

def exclamation(string):
    for i in string:
        if i in 'aeiou':
            string = string.replace(i, i*4)
    return string + '!'

exclamation('excellent') должен вернуть eeeexceeeelleeeent!

, однако он возвращает: eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeexceeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeelleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeent!

Как указано, функция отлично работает для всех других гласных, кроме e .

Спасибо!

Ответы [ 5 ]

0 голосов
/ 11 февраля 2019

Это происходит потому, что ваш цикл будет также рассматривать замененные 'e' как элемент строки.

Вот что я говорю:

  • String превосходно
  • Переберите строку и проверьте, является ли буква гласной
    • Если буква гласная, запишите эту гласную 4 раза.

Следуя вышеуказанным шагам, мы найдем этот результат в качестве первой итерации.

Первая итерация будет работать с первой буквой 'e' и заменит ее на 'eeee'.Таким образом, в конце первой итерации наша последняя строка будет иметь вид: 'eeeexcellent'

Теперь для второй итерации она будет считать окончательную строку , которую мы получилипосле первой итерации.И для второй итерации слово, которое нужно рассмотреть, будет только «е».Итак, как вы можете видеть, вам нужно поддерживать строку такой, какая она есть после каждой итерации, и сохранять замененный результат в новой строке.(в конце концов, это всегда будет новая строка, так как строка не изменяемая)

def exclamation(string):
    tmp = ''               #taking temporary variable to store the current data
    for i in string:
        if i in 'aeiou':
            tmp += i*4     # i*4 only if i is vowel
        else:
            tmp += i       # keeping i as it is if it's not vowel
    return tmp + '!'

Вы также можете попробовать понимание списка, которое также легко читается и понимается:

def exclamation(string):
        newstr = [ i*4 if i in 'aeiou' else i for i in string]
        return ''.join(newstr)+'!'
0 голосов
/ 11 февраля 2019

Для каждого гласного, через который вы итерируете, цикл проверяет условие, заменяет содержимое в той же строке, а затем итерирует на 1, которая теперь является той же самой строкой, но вместо следующей новой буквы она теперь имеет дело сЕще 3 таких же гласных.Например:

Давайте поговорим о строке «отлично».Для первой гласной «e» она заменяется на «eeee», в результате чего строка «eeeexcellent», теперь, когда начинается второй цикл, она начинается с индекса (1), который по-прежнему является «e», и это продолжается. Никогда не изменяйте итерацию, по которой вы повторяете.

0 голосов
/ 11 февраля 2019

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

def exclamation(string):
    new = ''
    for i in string:
        if i in 'aeiou':
            new += i*4
        else:
            new += i
    return new + '!'
0 голосов
/ 11 февраля 2019

def exclamation (string):

result = ''
for i in string:
    if i in 'aeiou':
        vowel = i * 4
    else:
        vowel = i
    result += vowel
return result + '!'

Причина, по которой замена не сработала на отлично, состоит в том, что у нас есть 3 'e', ​​в которых означает для каждого из 'e' в цикле, замена умножится на 4, что, безусловно, даст вам 12 'е на одно' е 'в отличном

0 голосов
/ 11 февраля 2019

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

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

def exclamation(s):
    for vowel in 'aeiou':
        s = s.replace(vowel, vowel*4)
    return s + '!'

print(exclamation('excellent'))
# 'eeeexceeeelleeeent!'

Обратите внимание, что это работает, только если слово уже в нижнем регистре (хотя это было бы легко исправить, добавьте в цикл заглавные гласные).

Другим способом сделать это было бы определение таблицы перевода для одновременного выполнения всех замен:

trans = str.maketrans({vowel: vowel*4 for vowel in 'aeiou'}) 

def exclamation(s):
    return s.translate(trans)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...