#python
#питон #python
Вопрос:
У меня есть задача, в которой я должен перевести английские слова на pig latin, это означает, что если слово начинается с гласной, в конце слова добавляется «ay» («apple» станет «appleay»), это не было проблемой, поскольку код было относительно легко написать.
Однако вторая часть заключается в том, что если слово начинается с согласной, все согласные перед первой гласной удаляются и добавляются в конец слова, а строка «ay» снова добавляется в конец после этого («сыр» станет «eesechay»).
Это довольно простая концепция, но я изо всех сил пытаюсь найти способ перевести слово, если слово начинается с согласной, вот мой код на данный момент:
def pigLatin(word):
for l in vowels:
if word[0] == l:
word = word "ay"
for L in consonants:
if word[0] == L:
for i in vowels:
for s in word:
if s == i:
#this is where im completely lost
К вашему сведению, гласные и согласные — это массивы, содержащие только гласные и согласные, word вводится пользователем.
Редактировать:
спасибо за помощь, мне удалось переделать код и получить что-то, что работает:
def pigLatin(word):
if word[0]in vowels:
word = word "ay"
elif word[0] in consonants:
c = ""
for l in word:
if l in vowels:
break
elif l in consonants:
c = c l
word = word[len(c)-len(word):len(word)]
word = word c "ay"
еще раз спасибо за помощь 🙂
Комментарии:
1. Вместо того, чтобы зацикливаться на слове самостоятельно, подумайте о том, чтобы позволить Python выполнить работу за вас. Например, регулярное выражение
^([^aeiou]*)([aeiou].*)
выделит содержимое перед первой гласной в отдельную группу соответствия со всем, что после нее.2. Согласно комментарию Чарльза Даффи, регулярные выражения, безусловно, справятся с этой задачей. С другой стороны, вместо того, чтобы перебирать каждую гласную / согласную, перебирайте каждую букву в вашем слове. Начните с проверки того, является ли word [0] гласной (например, если word [0] состоит из гласных), если это так, то вы знаете, что делать. Если нет, перебирайте буквы в word, пока не найдете гласную, переместите все до этого в конец слова и добавьте «ай»
3. @CharlesDuffy куда в коде это могло бы пойти? я все еще в замешательстве
4. Прямо скажем, разработка вашей программы для вас выходит за рамки того, что мы обычно делаем здесь; Stack Overflow ориентирован на то, чтобы быть набором ответов на конкретные, узкие проблемы, возникающие при написании кода. «Как я могу лучше спроектировать программу / алгоритм для выполнения X?» имеет неограниченный набор ответов; это выходит за рамки этой «узкой и конкретной» спецификации.
5. @tnknepp проблема, с которой я сталкиваюсь, заключается не в поиске гласной или согласной, а в том, что я не уверен, что делать дальше, если s == i: идентифицирует гласную после того, как я получил согласную в начале слова, я просто не знаю, какой код мне нужно написать, чтобы затем получить все согласные после этой гласной, а затем объединить это в конце
Ответ №1:
Вот несколько вещей, которые могут помочь:
ascii_lowercase
в string
модуле есть предопределенная строка, содержащая все строчные буквенные символы:
>>> from string import ascii_lowercase
>>> ascii_lowercase
'abcdefghijklmnopqrstuvwxyz'
>>>
Мы можем сгенерировать набор всех согласных, создав набор гласных и взяв разницу между гласными и всеми символами:
from string import ascii_lowercase as alphabet
vowels = set("aeiou")
consonants = set(alphabet) ^ vowels
print(consonants)
Вывод:
{'c', 's', 'q', 'm', 'g', 'd', 'y', 'l', 'b', 'k', 't', 'j', 'r', 'p', 'h', 'v', 'n', 'w', 'z', 'f', 'x'}
>>>
Поскольку это набор, нет внутреннего порядка, но это не имеет значения. Если мы хотим знать, является ли данный символ согласным или гласным, мы просто проверяем принадлежность к соответствующему набору (вы можете сделать то же самое со списками, но предпочтительной структурой данных будет набор).
Независимо от того, используете ли вы списки или наборы для вашего vowels
и consonants
, вы можете упростить свой код, просто проверив членство (проверяя, есть ли символ в коллекции):
if word[0] in vowels:
# The first letter is a vowel
elif word[0] in consonants:
# The first letter is a consonant
Если вы заранее знаете, что word
будет содержать только строчные буквенные символы (без специальных символов, цифр, прописных букв и т.д.), То вы могли бы упростить его еще больше:
if word[0] in vowels:
# The first letter is a vowel
else:
# If it's not a vowel, it must be a consonant
Однако, если вы подумаете об этом, вам вообще не нужно проверять, является ли первая буква гласной. Вы уже знаете, что будете добавлять "ay"
в конце последней строки, независимо от того, является ли первая буква гласной или согласной — так что вам действительно просто нужно проверить, является ли первая буква согласной.
Используя все до сих пор, я бы пришел к следующему псевдокоду:
def to_pig_latin(word):
from string import ascii_lowercase as alphabet
vowels = set("aeiou")
consonants = set(alphabet) ^ vowels
if word[0] in consonants:
# Do something
return ... "ay"
Я переименовал функцию to_pig_latin
, поскольку предпочтителен регистр snake, а префикс имени функции с to
указывает на то, что вы что-то переводите / преобразуете. Я также перенес создание vowels
и consonants
в функцию, просто потому, что нет причин размещать его вне функции, и так это симпатичнее.
Комментарии:
1. спасибо вам за это, вы ответили, когда я уже получил решение, но оно все еще было информативным, я отредактировал свое решение в своем первоначальном вопросе, так что вы можете взглянуть на это, если хотите.
Ответ №2:
Я согласен с комментарием Чарльза Даффи о том, что мы не разрабатываем программы для вас. Однако вы идете не по тому пути, и я думаю, вам нужно небольшое руководство. Вот пример того, о чем я говорил. Есть много способов сделать это, это простое решение (одно из многих).
def pigLatin(word):
vowels = list("aeiou")
consonants = list("bcdfghjklmnpqrstvwxyz")
if word[0] in vowels:
word = word "ay"
else:
for counter, letter in enumerate(list(word)):
if letter in vowels:
word = word[counter:] word[:counter] "ay"
break
return word
print(pigLatin("art"))
print(pigLatin("donkey"))
Что делать, если слово, переданное в PigLatin, содержит символы верхнего регистра? Вы можете изменить функцию, преобразовав все в нижний регистр (или верхний, по вашему усмотрению).
def pigLatin(word):
vowels = list("aeiou")
consonants = list("bcdfghjklmnpqrstvwxyz")
if word[0].lower() in vowels:
word = word "ay"
else:
for counter, letter in enumerate(list(word)):
if letter.lower() in vowels:
word = word[counter:] word[:counter] "ay"
break
return word
Получаете ли вы представление о том, насколько проще и гибче этот код?
Комментарии:
1. спасибо вам за это, но когда вы писали это, я воспользовался вашей идеей упростить код для определения гласной, и это действительно помогло мне, вот что я получил:
2. по какой-то причине это не позволит мне показывать код в этом формате в комментариях, но у меня есть некоторый код, который работает сейчас, и мне не нужно копировать то, что вы написали
3. @haz Вы должны поместить этот код в свой исходный вопрос в качестве редактирования. Или, если это работает, вы можете опубликовать ответ на свой собственный вопрос.
4. я отредактировал его в вопросе @tknepp спасибо за помощь 🙂