【问题标题】:Need help writing Pig Latin translation code in python需要帮助在 python 中编写 Pig 拉丁语翻译代码
【发布时间】:2020-12-20 14:23:02
【问题描述】:

我有一个任务,我必须将英语单词翻译成猪拉丁语,这意味着如果一个单词以元音开头,则单词末尾添加“ay”(“apple”将变为“appleay”)这是这不是问题,因为代码相对容易编写。
但是,第二部分是如果单词以辅音开头,第一个元音之前的所有辅音都将被删除并添加到单词的末尾,字符串“ay”也会再次添加到之后的结尾(“cheese”将变为“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

仅供参考,元音和辅音是仅包含元音和辅音的数组,单词由用户输入。

编辑:

感谢您的帮助,我已经设法重新编写代码并获得了一些有用的东西:

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"

再次感谢您的帮助:)

【问题讨论】:

  • 与其自己循环单词,不如考虑让 Python 为您完成工作。例如,正则表达式^([^aeiou]*)([aeiou].*) 会将第一个元音之前的内容与之后的所有内容拆分为一个单独的匹配组。
  • 根据 Charles Duffy 的评论,正则表达式肯定可以完成这项工作。另一方面,不要遍历每个元音/辅音,而是遍历单词中的每个字母。首先检查 word[0] 是否是元音(例如,如果 word[0] 在元音中),如果是,那么你知道该怎么做。如果没有,遍历 word 中的字母直到找到一个元音,将之前的所有内容移动到单词的末尾并添加“ay”
  • @CharlesDuffy 那会在代码中的哪个位置出现?我还是一头雾水
  • 坦率地说——为你设计你的程序超出了我们通常在这里做的范围; Stack Overflow 专注于为编写代码时遇到的特定、狭窄问题提供答案的集合。 “我怎样才能更好地设计一个程序/算法来做 X?”有无限的答案;它超出了“狭隘而具体”的规范。
  • @tnknepp 我遇到的问题不是找到元音或辅音,如果 s == i,我不确定以后该从哪里继续:在我在单词的开头找到辅音后识别元音,我只是不知道我需要编写什么代码,然后在该元音之后获取所有辅音,然后将其连接到末尾

标签: python


【解决方案1】:

以下几点可能会有所帮助:

string 模块中的ascii_lowercase 是一个包含所有小写字母字符的预定义字符串:

>>> 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'}
>>> 

因为这是一个集合,所以没有内在的顺序,但这并不重要。如果我们想知道给定字符是辅音还是元音,我们只需检查对应集合的成员资格(您可以对列表执行相同操作,但集合将是首选的数据结构)。

无论您是否为vowelsconsonants 使用列表或集合,您都可以通过简单地检查成员资格(检查字符是否在集合中)来简化代码:

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,因为首选蛇形大小写,并且在函数名称前加上 to 表示您正在翻译/转换某些内容。我还把vowelsconsonants的创建移到了函数中,只是因为没有理由把它放在函数之外,这样更可爱。

【讨论】:

  • 谢谢你,当我已经得到解决方案时你回答了,但它仍然提供信息,我将我的解决方案编辑到我最初的问题中,所以如果你愿意,你可以看看。跨度>
【解决方案2】:

我同意 Charles Duffy 的评论,即我们不会为您设计程序。但是,您走错了兔子洞,我认为您需要一些指导。这是我所说的一个例子。有很多方法可以做到这一点,这是一个简单的解决方案(其中之一)。

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

你知道这段代码有多简单和灵活吗?

【讨论】:

  • 谢谢你,但在你写这篇文章的时候,我采纳了你简化代码以识别元音的想法,这对我很有帮助,这就是我得到的:
  • 好吧,由于某种原因,它不会让我在 cmets 中显示该格式的代码,但我确实有一些现在可以使用的代码,我不必复制你写的内容
  • @haz 您应该将此代码作为编辑放在原始问题中。或者,如果可行,您可以发布自己问题的答案。
  • 我把它编辑成问题@tknepp 谢谢你的帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-13
  • 2013-01-15
  • 2018-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多