Ошибка в решении задачи "Поросячья латынь"

На всякий случай, я только недавно изучаю Python. Мой код выполняет задачу, но по какой то причине, при использовании слова 'have' делает это несколько раз. Я много времени потратил на то, чтобы найти ошибку, но так и не смог. Надеюсь на помощь кого то и пользователей. К сожалению, не справился с форматированием кода на сайте, получается через одно место )

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

  1. если слово начинается с согласной буквы (включая y), то все буквы с начала слова и до первой гласной (за исключением y) переносятся в конец слова и дополняются сочетанием букв ay. Например, слово computer будет преобразовано в omputercay, а слово think – в inkthay;

  2. если слово начинается с гласной буквы (не включая y), к концу слова просто добавляется way. К примеру, слово algorithm превратится в algorithmway, а office – в officeway.

Также добавить проверки на наличие больших букв в слове. Они должны сохраняться.

  1. Если в оригинале слово начинается с заглавной буквы, то в переводе на «поросячью латынь» оно также должно начинаться с заглавной буквы, тогда как буквы, перенесенные в конец слов, должны стать строчными. Например, слово Computer должно быть преобразовано в Omputercay.

  2. Если в конце слова стоит знак препинания, он там же и должен остаться после выполнения перевода. То есть слово в конце предложения Science! необходимо трансформировать в Iencescay!

    def pig_latin(words_list):
        vowels = ['a','A','e','E','i','I','o','O','u','U']
        consonants = ['b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','y','z',
                     'B','C','D','F','G','H','J','K','L','M','N','P','Q','R','S','T','V','W','X','Y','Z']
        punctuation_marks = [',','.','!','?']
        change_words = []
    
        for word in words_list:
            if word[0] in vowels:
                if word[-1] in punctuation_marks:
                    change_words.append(word[0 : -1] + 'way' + word[-1])
                else:
                    change_words.append(word + 'way')
    
            elif word[0] in consonants :
                if word[0].isupper() and word[-1] in punctuation_marks:
                    for index in range(len(word)):
                        if word[index] in vowels:
                            change_words.append(word[index].upper() + word[-index:-1] + word[:index].lower() + 'ay' + word[-1])
                            print('1')
                elif word[0].isupper() and word[-1] not in punctuation_marks:
                    for index in range(len(word)):
                        if word[index] in vowels:
                            change_words.append(word[index].upper() + word[-index:] + word[:index].lower() + 'ay')
                            print('2')
                elif word[0].lower() and word[-1] in punctuation_marks:
                    for index in range(len(word)):
                        if word[index] in vowels :
                            change_words.append(word[index:-1] + word[:index] + 'ay' + word[-1]) 
                            print('3')
                elif word[0].lower() and word[-1] not in punctuation_marks:  
                    for index in range(len(word)):
                        if word[index] in vowels:
                            change_words.append(word[index:] + word[:index] + 'ay')
                            print('4')
    
    
        return ' '.join(change_words)
    
    def main():
        user_input = input('Введите слово для перевода на "поросячью латынь"')
        user_input = user_input.split()
        print(pig_latin(user_input))
    
    if __name__ == '__main__' :
        main()
    

Ответы (1 шт):

Автор решения: strawdog

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

word_list = ["think", "algorithm", "office", "Computer", "Science!"]
def pig_latin(words):
    results = []
    for word in words:
        vowels = ['a', 'e', 'i', 'o', 'u']
        consonants = ['b', 'c', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 'm', 'n', 'p', 'q', 'r', 's', 't', 'v', 'w', 'x', 'y', 'z']
        punctuation_marks = [',', '.', '!', '?']
        ending = ""
        if word[-1] in punctuation_marks:
            res = word[:-1]
            ending = word[-1]
        else:
            res = word
        if res[0] in vowels:
            res = res+"way"
        else:
            for i in range(len(res)):
                if res[i] in vowels:
                    res = res[i:]+res[:i]+"ay"
                    break
        if word.lower() != word:
            res = res.title()
        results.append(res+ending)
    return results
print(pig_latin(word_list))

['inkthay', 'algorithmway', 'officeway', 'Omputercay', 'Iencescay!']

→ Ссылка