如果's'中的最后一个单词以辅音开头,它将表示索引超出范围。如何更改程序以更改它?


def to_pig_latin(s):
    j = 0 # points to first character in word  
    i = 0
    new_sentence_1 = '' # variable to store strings being changed
    vowel_position = 0 # show the position of the first vowel
    number_of_words = 0
    number_of_spaces = s.count(" ") 
    number_of_words = number_of_spaces + 1
    space_position = s.find(" ") # find the position of the first space
    sent = s[:space_position] # slice the first word of the sentence
    old_sent = s[len(sent)+1:] # stores the old sentence without the first word of s
    while number_of_spaces >= 0:
        if sent[j] in ["a", "e", "i", "o", "u"]: # checks if first character is a vowel
            new_sentence = sent + "way" # adds 'way' to the first word
            new_sentence_1 = new_sentence_1 + ' ' + new_sentence # adds the words
        else: # if first character is not equal to a vowel
            for i in range(len(sent)):
                # check to see if first character in s is a vowel
                if s[i] == 'a': 
                    break
                if s[i] == 'e':
                    break
                if s[i] == 'i':
                    break
                if s[i] == 'o':
                    break
                if s[i] == 'u':
                    break
            vowel_position = i # takes position of first vowel reached in word
            consonant_sequence = sent[:vowel_position] # stores all the consonants up to the first vowel, but not the first vowel
            sent = sent[vowel_position:] # slices the word from the first vowel to the end
            new_sentence = sent + 'a' + consonant_sequence + 'ay' # adds strings
            new_sentence_1 = new_sentence_1 + ' ' + new_sentence # adds the words
        s = old_sent # takes the value of old_sent
        space_position = s.find(" ") # find the position of the first space

如何更改下面的部分以便即使s中有一个单词也能进行检查?或者,如果字符串中的最后一个单词s以一个或多个辅音开头的单词结尾?

    if space_position == -1:
        space_position = len(s)
        sent = s[:space_position]
        if sent[j] in ["a", "e", "i", "o", "u"]:
            new_sentence = sent + "way"
            new_sentence_1 = new_sentence_1 + ' ' + new_sentence
            break
        else:
            for i in range(len(sent)):
                if s[i] == 'a':
                    break
                if s[i] == 'e':
                    break
                if s[i] == 'i':
                    break
                if s[i] == 'o':
                    break
                if s[i] == 'u':
                    break
        vowel_position = i
        consonant_sequence = sent[:vowel_position]
        sent = sent[vowel_position:]
        new_sentence = sent + 'a' + consonant_sequence + 'ay'
        new_sentence_1 = new_sentence_1 + ' ' + new_sentence            

    sent = s[:space_position]
    old_sent = s[len(sent)+1:]
    number_of_spaces = s.count(" ")
    number_of_words = number_of_spaces + 1
return new_sentence_1[1:]

英语/皮拉丁语翻译测试程序:

import piglatin
choice = input ("(E)nglish or (P)ig Latin?n")
action = choice[:1]
if action == 'E':
    s = input("Enter an English sentence:n")
    new_s = piglatin.to_pig_latin(s)
    print("Pig-Latin:")
    print(new_s)
elif action =='P':
    s = input("Enter a Pig Latin sentence:n")
    new_s = piglatin.to_english(s)
    print("English:")
    print(new_s)

输出:

(E)nglish or (P)ig Latin? E
Enter an English sentence: My friend next to me is wearing a shoe
Traceback (most recent call last):  
  File "/Applications/Wing101.app/Contents/Resources/src/debug/tserver/_sandbox.py",
   line 9, in <module>
  File "/Users/azhar/Desktop/Computer Science/Assignments/Assignment 4 (Functions & Strings)/piglatin.py", line 46, in to_pig_latin
    if sent[j] in ["a", "e", "i", "o", "u"]: # checks if first value in j is equal to a vowel
builtins.IndexError: string index out of range
我认为

,与其解决该特定问题,不如简化代码更容易。

首先,您可以使用 s.split() 拆分句子,这将为您提供在空格上拆分的单词列表。 其次,您可以使用s.find()查找给定字符串的索引。 第三,您可以使用' '.join(sen)来连接使用空格的字符串列表。

因此,使用这些,您的代码可以简化为以下内容(我还添加了大写处理):

def to_pig_latin(sen):
    senlst = sen.lower().split()  # split into list of words
    for i, word in enumerate(senlst):
        if word[0] in 'aeiou':
            senlst[i] += 'way'
        else:
            for vow in 'aeiou':
                ind = word.find(vow)
                if ind >= 0:
                    break
            if ind < 0: # no vowel in word
                continue
            senlst[i] = word[ind:]+'a'+word[:ind]
    newsen = ' '.join(senlst)  # combine list of words into sentence
    if sen[0].isupper():  # make capitalization like original
        newsen = newsen.capitalize()
    return newsen

但是,如果您真的想检查是否有单词,则可以if s.strip():。 这将做的是去除和前导或尾随空格。 如果没有单词,这将给您留下一个空字符串。 在python中,空字符串(或空列表或元组)被认为是False,所以你可以在if测试中使用它,然后对这种情况进行任何你想要的处理。

最新更新