Добавление строки после каждой гласной

В настоящее время я работаю над проектом по разработке небольшой забавной программы, которая принимает имя в качестве входных данных и возвращает имя со строкой «би» после каждой гласной в имени.

Я сталкиваюсь с проблемой, что моя программа работает в бесконечном цикле, когда у меня есть имя, которое дважды содержит одну и ту же гласную, например: имя «ая». технически он должен возвращать "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, который должен решить эту проблему. Честно говоря, сейчас у меня нет ответов, и я ищу помощи. Вы, ребята, можете увидеть что-то, чего не вижу я.

Не изменяйте списки (NameList) во время итерации по ним, это приводит к неопределенному поведению.

Michael Ruth 21.11.2022 21:08
Мутабельность и переработка объектов в Python
Мутабельность и переработка объектов в Python
Объекты являются основной конструкцией любого языка ООП, и каждый язык определяет свой собственный синтаксис для их создания, обновления и...
Другой маршрут в Flask Python
Другой маршрут в Flask Python
Flask - это фреймворк, который поддерживает веб-приложения. В этой статье я покажу, как мы можем использовать @app .route в flask, чтобы иметь другую...
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
Проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
Python PyPDF2 - запись метаданных PDF
Python PyPDF2 - запись метаданных PDF
Python скрипт, который будет записывать метаданные в PDF файл, для этого мы будем использовать PDF ридер из библиотеки PyPDF2 . PyPDF2 - это...
Переменные, типы данных и операторы в Python
Переменные, типы данных и операторы в Python
В Python переменные используются как место для хранения значений. Пример переменной формы:
Почему Python - идеальный выбор для проекта AI и ML
Почему Python - идеальный выбор для проекта AI и ML
Блог, которым поделился Harikrishna Kundariya в нашем сообществе Developer Nation Community.
0
1
54
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Причина, по которой ваша функция продолжает зацикливаться, заключается в том, что, как вы сказали, у вас есть одна и та же гласная дважды, в то время как вы также ищете индекс гласной. Проблема в том, что метод 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))

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

Mohammed Sabaawi 21.11.2022 21:30

Вы также можете сделать это с помощью 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

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

Другие вопросы по теме