Нужна помощь в написании кода перевода Pig Latin на python

#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 спасибо за помощь 🙂