Ошибка в решении задачи "Поросячья латынь"
На всякий случай, я только недавно изучаю Python. Мой код выполняет задачу, но по какой то причине, при использовании слова 'have' делает это несколько раз. Я много времени потратил на то, чтобы найти ошибку, но так и не смог. Надеюсь на помощь кого то и пользователей. К сожалению, не справился с форматированием кода на сайте, получается через одно место )
Задача Написать программу, которая будет выполнять изменение слов по принципу "поросячья латынь".
если слово начинается с согласной буквы (включая y), то все буквы с начала слова и до первой гласной (за исключением y) переносятся в конец слова и дополняются сочетанием букв ay. Например, слово computer будет преобразовано в omputercay, а слово think – в inkthay;
если слово начинается с гласной буквы (не включая y), к концу слова просто добавляется way. К примеру, слово algorithm превратится в algorithmway, а office – в officeway.
Также добавить проверки на наличие больших букв в слове. Они должны сохраняться.
Если в оригинале слово начинается с заглавной буквы, то в переводе на «поросячью латынь» оно также должно начинаться с заглавной буквы, тогда как буквы, перенесенные в конец слов, должны стать строчными. Например, слово Computer должно быть преобразовано в Omputercay.
Если в конце слова стоит знак препинания, он там же и должен остаться после выполнения перевода. То есть слово в конце предложения 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 шт):
Ваша ошибка в том, что при поиске первой гласной с лове, начинающемся с согласной, вы не прерываете цикл (и обработку слова) после нахождения этой самой гласной.
я бы сделал короче, чуть изменив логику.
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!']