【问题标题】:Pig Latin Python program猪拉丁Python程序
【发布时间】:2021-10-29 06:43:49
【问题描述】:

我一直在研究 Pig Latin 程序。但是,它似乎不起作用,我不知道为什么。

user_input = input("Enter word to be translated:")

def translate(user_input): 
    first = user_input[0]
    if first == "a" or "e" or "i" or "o" or "u": 
         user_input = user_input.lower()
         user_input += "way" 
         return user_input
    else: 
        user_input = user_input.lower()
        user_input = user_input[1:]+first+"ay" 
        return user_input 

print(translate(user_input))

最重要的是,我希望利用 enumerate 来查找第一个元音的位置,切片以隔离单词的第一个字母并连接以形成单词。我已经阅读了如何在几个网站上使用它,但我似乎无法弄清楚如何正确地将它应用到这个程序中。我想我必须在 def translate(user_input) 之前定义 Vowels = 'aeiou' 对吗?

【问题讨论】:

  • 当你说它不工作是什么意思?你有错误吗?输出不是你预期的吗?

标签: python python-3.x


【解决方案1】:

你不能在 Python 中像这样链接 if 语句,你必须做很长的路:

if first == "a" or first == "e" or first == "i" or first == "u":

或将其缩短为:

if first in ["a", "e", "i", "u"]:

【讨论】:

    【解决方案2】:

    这里是解决方案。我对您的代码进行了一些更改,我将在下面解释。

    user_input = input("Enter word to be translated:\n")
    #change_1
    vowels = ['a','e','i','o','u']
    def translate(user_input): 
        first = user_input[0]
    #change_2
        if first in vowels: 
             user_input = user_input.lower()
             user_input += "way" 
             return user_input
        else: 
            user_input = user_input.lower()
    #change_3
            for letter in user_input:
                if letter in vowels:
                    index_value = user_input.index(letter)
                    break
    #change_4
            user_input = user_input[index_value:] +user_input[:index_value]+ "ay" 
            return user_input 
    
    print(translate(user_input))
    

    1) 创建一个元音列表。

    2) 正如我们的朋友@zwer 所说,您不能将这样的 if 语句链接到 Python。所以

    如果在元音开头:

    3) 对于 user_input 中的每个字母,检查该字母是否是元音,如果该字母是元音,则查找其出现的 index

    以“垃圾”一词为例

    这里a是第一个元音,它的索引是2

    if letter in vowels: 
        index_value = user_input.index(letter)
    

    4) 根据维基百科

    "在首元音之前的所有字母都放在单词序列的末尾"

    对于“垃圾”这个词应该是

    user_string = user_input[2:] + user_input[:2]+"ay"

    这会将单词从该索引切割到结尾,并与该索引之前的字母合并。最后是“啊”。

    'ash' + 'tr' + 'ay'

    希望这会有所帮助。

    【讨论】:

    • 谢谢!!另外,很抱歉很烦人,但是在用户输入停止之前,我将如何继续进行此循环。我尝试在函数中使用 while 循环,但它一直给我错误
    • 否,而是将整个句子作为 user_input 并使用 'words = user_input.split()' 将其拆分为单词。 'for word in words: translate(word)' 就行了!
    【解决方案3】:

    您可以在外部范围内定义元音。

    vowels = 'a', 'e', 'i', 'o', 'u'
    

    然后在任何你可以使用的地方:

    if first in vowels:
    

    【讨论】:

      【解决方案4】:

      我的解决方案涵盖以下规则: 1. 单词是字母(a-z、A-Z)或撇号的连续序列。您可以假设函数的输入只是一个“单词”。示例:斑马、苹果 2.如果单词以元音开头,Pig Latin 版本就是原词加上“way”结尾 3. 如果单词以辅音或一系列连续辅音开头,Pig Latin 版本将所有辅音直到第一个元音转移到单词末尾,并在末尾添加“ay”。 4. 如果字母'y'是单词的第一个字母,则应将其视为辅音,否则应将其视为元音。 5.如果原词大写,新的Pig Latin版本的单词首字母要大写。如果原来的大写字母是一个辅音,因此被移动了,它不应该在新的位置大写一次。

      解决方案从这里开始:

          eng_to_pig_latin = {"football": "ootballfay", "Pittsburgh":"Ittsburghpay",
                      "Apple":"Appleway","oink":"oinkway", 
          "ontology":"ontologyway","yellow":"ellowyay","yttrium":"iumyttray"}
           eng_word = 'yttrium'
           vowels = 'aeiou'
           def pig_latin(eng_word):
              sub,str1 = [],''
              first = eng_word[0]
              second =  eng_word[1]
              # Rule 2
              if first.lower() in vowels:
                  piglatin = eng_word +'way'
              # Rule 3
              elif first.lower() == first and second.lower() in vowels:
                  piglatin = eng_word[1:]+first+'ay'
              elif first.lower()+second.lower() not in vowels:
                  # Rule 3 & 4
                  for l in eng_word:
                      if l not in vowels:
                          sub.append(l)
                      else:
                          str1 = eng_word[eng_word.index(l):]
                          break
                  str2 = ''.join(sub)
                  piglatin = str1+str2+'ay'
              else:
                  # Rule 5
                  piglatin = eng_word[1:].capitalize()+first.lower()+'ay'
              print(f'Test word is {eng_word} and its equivalent piglatin word is 
                    {piglatin}. Comparison with mapping dictionary is 
                     {eng_to_pig_latin[eng_word] == piglatin}')
      
          pig_latin(eng_word)
      

      注意:字典仅用于交叉检查结果是否符合预期,这是我在最后一个打印语句中所做的。

      【讨论】:

        【解决方案5】:

        我将给定单词翻译成猪拉丁语翻译的逻辑

        元音=['a','e','i','o','u']

        定义 igpay(名称):

        a_list=列表(名称)

        如果 a_list[0] 在元音中:

        print("第一个字母是元音")

        apnd_letters="路"

        其他:

        print("第一个字母是辅音")

        a_list.append(a_list[0])

        a_list.pop(0)

        apnd_letters="ay"

        print("猪的转换是{0}".format("".join(a_list)+str(apnd_letters)))

        输出:

        igpay("猪") 第一个字母是辅音 猪交易是igpay

        igpay("苹果") 第一个字母是元音 猪的转换是顺理成章的

        【讨论】:

        • 请花一些时间来正确格式化您的代码。这看起来不像是正确的 Python。 (使用三个反引号)
        【解决方案6】:

        除了需要更改translate 中的第二行之外,您可以完全按照自己的方式进行操作:

        if first == "a" or "e" or "i" or "o" or "u":
        

        到:

        if first == "a" or first == "e" or first == "i" or first == "o" or first == "u":
        

        或:

        if first in 'aeiou':
        

        如果您希望能够使用大写字母,我建议将first 更改为first.lower()

        这就变成了:

        user_input = input("Enter word to be translated:")
        
        def translate(user_input): 
            first = user_input[0]
            if first.lower() in 'aeiou': 
                 user_input = user_input.lower()
                 user_input += "way" 
                 return user_input
            else: 
                user_input = user_input.lower()
                user_input = user_input[1:]+first+"ay" 
                return user_input 
        
        print(translate(user_input))
        

        如果您希望代码更短一点,我已设法将其缩短为:

        def translate():
            user_input = input('Enter a word or sentence')
            for i in range(len(user_input.split())): print(str((user_input.split())[i][1::])+((user_input.split())[i])[0]+'ay', end=' ')
        translate()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-18
          • 1970-01-01
          相关资源
          最近更新 更多