选择单词中的第一个辅音(跟随多个元音)

时间:2018-07-23 13:26:35

标签: python python-3.x

嗨,我正在尝试制作猪拉丁语翻译器,当我尝试处理以元音开头的单词时出现了一个问题。目的是,对于开头带有元音的单词,后缀将是单词+“ ay”中的第一个辅音(而不是词首中的第一个字母)单词+“ ay”),例如“ ear”将是“ ear-ray”而不是“ ar-eay”

但是,我正在努力寻找一种方法来实现这一目标。

这是我到目前为止所拥有的:(它取自较大的代码段)

elif word[0]=="a" or word[0]=="e" or word[0]=="i" or word[0]=="o" or word[0]=="u":
    for letter in word[1:]:
      while consonantfound == False:
        if letter!="a" and letter!="e" and letter!="i" and letter!="o" and letter!="u":
          consonantfound = True
          consonant = letter
    suffix = consonant + "ay"
    newWord = i + "-" + suffix

这使程序无法产生输出并继续运行。

我觉得问题在于循环的顺序,但是我已经尝试过了,没有解决方案。可能还有我不知道的其他事情。

您对如何使其工作有建议吗?

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

尝试一下:

VOWELS = ('a', 'e', 'i', 'o', 'u')

def first_consonant(word):
    for letter in word:
        if letter.lower() not in VOWELS:
            return letter

def pig_latin(word):
    return '%s-%say' % (word, first_consonant(word) or word[0])

它尝试查找单词中的第一个辅音并将ay附加到末尾。如果它不存在,那么它会按照单词的第一个字母出现(我不知道这是否正确,但是您可以根据需要进行调整)。

答案 1 :(得分:0)

我们可以使用生成器表达式获取下一个凝聚剂及其索引。如果没有成分,我们将返回(None, None)

next(((letter, index) for index, letter in enumerate(word) if letter not in 'aioue'), (None, None))

我们可以稍微分解一下以了解发生了什么。

enumerate是一个返回迭代器的函数,该迭代器将可迭代的元素与其索引配对。因此list(enumerate('abc'))[(0, 'a'), (1, 'b'), (2, 'c')]。我们要获取第一个辅音的索引,以便我们知道在哪里进行切分。

((letter, index) for index, letter in enumerate(word) if letter not in 'aioue')是一个生成器表达式。生成器将一一生成值。这一切都是从我们列举的字母中过滤出元音。

next(generator, (None, None))使我们从生成器中获取下一项(将是第一项)。如果没有下一项(所有元音中的一个词),它将返回第二个参数(None, None)