В настоящее время я работаю над проектом по разработке небольшой забавной программы, которая принимает имя в качестве входных данных и возвращает имя со строкой «би» после каждой гласной в имени.
Я сталкиваюсь с проблемой, что моя программа работает в бесконечном цикле, когда у меня есть имя, которое дважды содержит одну и ту же гласную, например: имя «ая». технически он должен возвращать "abiyabi"
"""Welcome to the code of BoBi Sprache. This Sprache aka Language will
put the letter "bi" after each vowel letter in your name"""
print("Welcome to the BoBiSprache programm")
Name = input("Please enter your name to be BoBied :D : ")
NameList = list(Name.lower())
vowels = ["a", "e", "i", "o", "u"]
def VowelCheck(NameList):
for i in NameList:
index = NameList.index(i)
for j in vowels:
if i == j and index == 0:
NameList.insert(index + 1, "bi")
elif i == j and (str(NameList[index - 1]) + str(NameList[index])) != "bi":
NameList.insert(index + 1, "bi")
VowelCheck(NameList)
NewName = ""
NewName = (NewName.join(NameList)).title()
print("Your New Name is: %s" % NewName)
Сначала я подумал, что это проблема с первой буквой, которая является гласной. но я добавил оператор if, который должен решить эту проблему. Честно говоря, сейчас у меня нет ответов, и я ищу помощи. Вы, ребята, можете увидеть что-то, чего не вижу я.
Причина, по которой ваша функция продолжает зацикливаться, заключается в том, что, как вы сказали, у вас есть одна и та же гласная дважды, в то время как вы также ищете индекс гласной. Проблема в том, что метод index возвращает первый экземпляр искомого значения. Когда вы переходите к следующему элементу вашего списка, он остается тем же значением, что и раньше, поскольку вы редактируете свой список во время его повторения. Это также не будет «би», потому что оно было добавлено после первого экземпляра гласной.
Не рекомендуется редактировать список во время итерации. Лучшей практикой было бы создать новый список и добавить в него значения.
Создайте имя Bobied независимо от имени, отправленного пользователем. Также обратите внимание, что строки в Python являются итерируемыми, и нет необходимости преобразовывать введенное пользователем имя в список.
username = input("Please enter your name to be BoBied :D : ")
vowels = ["a", "e", "i", "o", "u"]
def VowelCheck(name):
bobified_name = ""
for i in name:
bobified_name += i
if i in vowels:
bobified_name += "bi"
return bobified_name
print("Your New Name is: %s" % VowelCheck(username).title())
Теперь, если вы хотите избежать циклов и условных выражений или иметь большой ввод: используйте str.translate(). Сначала создайте таблицу перевода, просто dict, которая сопоставляет гласные с укороченными гласными. Затем назовите translate() имя, которое нужно бобифицировать.
username = input("Please enter your name to be Bobied :D : ")
bobi_table = str.maketrans({
'a': 'abi',
'e': 'ebi',
'i': 'ibi',
'o': 'obi',
'u': 'ubi'
})
print("Your new name is: %s" % username.translate(bobi_table))
Большое спасибо. да, это совсем другой мир, если я понял, что строки являются итерируемыми. довольно аккуратный код. спасибо майкл
Вы также можете сделать это с помощью str.translate, которому вы можете дать несколько символов, чтобы изменить один символ на несколько:
username = input("Please enter your name to be BoBied :D : ")
vowels = ["a", "e", "i", "o", "u"]
vowels += [i.upper() for i in vowels]
translation_table = str.maketrans({i: i+"bi" for i in vowels})
print((f"Your BoBied name is: {username.translate(translation_table)}"))
Демо:
Please enter your name to be BoBied :D : Hampus
Your BoBied name is: Habimpubis
Я также добавил прописные буквы, чтобы не имело значения, в каком регистре пользователь вводит свое имя.
Не изменяйте списки (NameList) во время итерации по ним, это приводит к неопределенному поведению.