【问题标题】:Translating Pig Latin into English Using Python 3使用 Python 3 将 Pig Latin 翻译成英语
【发布时间】:2014-05-10 23:47:12
【问题描述】:

正如您将在下面的代码中看到的那样,我已经制作了一个将英语翻译成猪拉丁语的程序。它遵循两个规则:

  • 如果单词以元音开头,则应附加“way”(例如:apple 变为 appleway)
  • 如果单词以辅音序列开头,则该序列应移至末尾,以“a”为前缀,后跟“ay”(例如:please 变为easeaplay)

我知道这是一种奇怪的做法,但请幽默。

问题:翻译成英文时,我想不出办法让代码确切知道应该在哪一点将原始单词的根与后缀分开,因为有些单词以 1 个辅音开头,而另一些则以2个辅音等

任何帮助将不胜感激。请记住,我是新手。

vowels = ('AEIOUaeiou')

def toPigLatin(s):
    sentence = s.split(" ")
    latin = ""
    for word in sentence:
        if word[0] in vowels:
            latin += word + "way" + " "
        else:
            vowel_index = 0
            for letter in word:
                if letter not in vowels: 
                    vowel_index += 1
                    continue
                else: 
                    break
            latin += word[vowel_index:] + "a" + word[:vowel_index] + "ay" + " "
    return latin[:len(latin) - 1]

def toEnglish(s):
    sentence = s.split(" ")
    english = ""
    for word in sentence:
        if word[:len(word) - 4:-1] == 'yaw':
            english += word[:len(word) - 3] + " "
        else: 
            #here's where I'm stuck
    return english

提前致谢!

【问题讨论】:

  • 从 Pig Latin 到英语的完全明确的翻译是不可能的。例如,“oat”和“two”都翻译为“oatway”。
  • 这是做作业的吗?
  • 根据en.wikipedia.org/wiki/Pig_Latin中的规则,结尾辅音结构不应以'a'为前缀。因此,please 应该成为easeplay 而不是easeaplay。如果你不加前缀 a,那么 win 和 in 都变成了 inway。无论您遵循哪条规则,都没有唯一的反向翻译。由于没有唯一的反向翻译,因此您无法设置一个算法来从 Pig Latin 到 English 并获得明确的结果。
  • @sabbahillel OP 说:“我知道这是一种奇怪的做法,但请取笑我。”显然他没有遵守标准的猪拉丁规则!
  • @2rs2ts 我试图说明的一点是,无论他使用哪一套规则,从英语到猪拉丁语的翻译都没有唯一的。因此,不可能有反向翻译算法。由于时间限制在我打字时已过期,我无法编辑评论以使要点更清楚。

标签: python language-translation


【解决方案1】:

Kevin 认为完全明确的翻译是不可能的,但我认为这可能是您正在寻找的:

def toEnglish(s):
    sentence = s.split(" ")
    english = ""
    for word in sentence:
        if word[:len(word) - 4:-1] == 'yaw':
            english += word[:len(word) - 3] + " "
        else: 
            noay = word[:len(word) - 2]
            firstconsonants = noay.split("a")[-1]
            consonantsremoved = noay[:len(noay) - (len(firstconsonants)+1)]
            english += firstconsonants + consonantsremoved + " "
    return english

【讨论】:

  • 使用split也是一个很好的解决方案!
  • 我已经尝试过了,到目前为止它似乎有效。感谢您的仓促回复。
【解决方案2】:

尽管正如 Kevin 和 ghoti 所指出的,这不会对每个猪拉丁词都成功,但您可以通过查找您要添加的特殊 'a' 来非常接近。

首先,去掉最后多余的'ay',因为它会导致搜索你的特殊'a':

>>> tmp = word[:-2]
>>> tmp
'easeapl'

然后,使用find 或index 以获取该特殊'a' 的位置。请注意,它会从字符串的开头开始搜索,因此您应该暂时反转字符串:

>>> tmp = tmp[::-1]
>>> tmp
'lpaesae'
>>> ind = tmp.index('a')
>>> ind
2

现在,取出该索引左侧的部分和该索引右侧的部分,将它们中的每一个反转,然后重新组合。这些切片开始变得相当棘手,所以请耐心等待:

>>> prefix = tmp[ind-1::-1]
>>> prefix
'pl'
>>> suffix = tmp[:ind:-1]
>>> suffix
'ease'
>>> english = prefix + suffix
>>> english
'please'

有关切片的更多信息,请参阅great answer。

【讨论】:

  • 这非常有用。谢谢。
【解决方案3】:

我确实看到了你的问题。

strap -> apstray 看起来很简单。但根据你的规则,它可能会反转为 rapst 或 traps。

也许一种方法是循环遍历各种可能性,直到找到与英语单词匹配的单词。你可以做一个单词表:

with open("/usr/share/dict/words","r") as f:
    wordlist = f.read().splitlines()

然后在toEnglish 中,后退一步完成突变的每次迭代(添加if word in wordlist: 以测试每个rapst、traps 等)。如果它在列表中,然后确定一个单词。

这种方法在“strap”之类的词上肯定会失败。 :-) YMMV。

【讨论】:

  • 其实strap -> apAstray(大写A表示强调)
  • 我应该声明我不想使用列表、字典等。原始代码。我什至使用泰勒级数公式计算 pi、e 和 trig 函数。它加快了我的学习速度:)
【解决方案4】:
def toEnglish(s):
    sentence = s.split(" ")
    english = ""
    for word in sentence:
        if word[:len(word) - 4:-1] == 'yaw':
            english += word[:len(word) - 3] + " "
        else:
            index = -3
            # count consonent between two last a
            for letter in reversed(word[:-3]):
                if letter is not 'a':
                    index-=1
                else:
                    break
            english +=  word[index:-2] + word[:index-1] + " "
    return english

应该是诀窍:)

【讨论】:

  • Yellow 变成 ellowyay,不是吗? 纱线变成了arnyay? Y 是一个间歇/不规则元音,因此需要比这更复杂的分析。
  • 在 OP 中的示例上失败。 >>> word = "easeaplay">>> word[-3:-2] + word[:-4]'leasea'
  • 取决于 y 是否被视为元音
  • Y 是 "hyper" (yperhay) 中的元音,以及 "yak" (akyay) 中的辅音。
  • 我对问题的措辞非常谨慎。在我的示例中,我选择 Y 不是元音,因为我的代码绝对无法知道某物的发音方式。但感谢您的关注和回复。
【解决方案5】:

嗯,对我来说,我就是这样做的:

word = "python"

word = word[1:len(word)] + word[0] + "ay"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    相关资源
    最近更新 更多