我试图检查索引是否超出范围,但我使用的代码是指数超出范围?

时间:2017-03-27 18:37:24

标签: python-3.x error-handling range sequence

我构建了这个函数来将字符串输入更改为pig latin。我试图检查索引是否超出范围,但我的检查方法是让索引超出范围。

见如下:

def simple_pig_latin(input, sep=' ', end='.'):
    words=input.replace(" ", " ").split(sep)
    new_sentence=""
    Vowels= ('a','e','i','o','u')
    Digit= (0,1,2,3,4,5,6,7,8,9)
    cons=('b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','y','z')
    characters= ('!','@','#','$','%','^','&','*','.')
    for word in words:
        if word[0] == " ":
            new_word=word
        else:   
            if word[0] in Vowels:
                new_word= word+"way"
            if word[0] in Digit:
                new_word= word
            if word[0] in cons:
                first_letter=word[0] #saves the first letter
                change= str(word) #change to string                     
                rem= change.replace(first_letter,'')
                put_last= rem+first_letter #add letter to end
                new_word= put_last+"ay"
            if word[0] in characters:
                new_word= word
            new_sentence= new_sentence+new_word+sep

new_sentence= new_sentence.strip(sep)+end
return new_sentence

你可以看到第一个if语句正在检查它是否为空,但我收到了这个确切的错误:

“第9行IndexError:字符串索引超出范围”

我还能检查空序列吗?我不能在范围(len(单词))中使用单词,因为那时我的if语句都不起作用。它会告诉我对象不是可订阅的。

1 个答案:

答案 0 :(得分:1)

在你的循环中,你假设word不是空的,根本不能保证,因为你根据空间进行拆分,并且当发现空字段时可以发出空字段有超过1个空间。

>>> "a  b".split(" ")
['a', '', 'b']

所以你可以在没有任何参数的情况下使用split()(仅适用于类似空格的字符),或者如果您正在使用其他分隔符,请在循环之前过滤掉空字段,例如在列表理解中:

words= [ w for w in input.split(sep) if w ]

现在您确定words的每个项目至少包含1个字符。

编辑:关于split和过滤掉空字符串的漂亮解释非常多,但这似乎并没有削减它,因为你可以使用l作为{{1的分隔符所以回到基础:

hello world

更改代码:

  • 使用列表,最后使用def simple_pig_latin(input, sep=' ', end='.'): words=input.split(sep) new_sentence="" Vowels= ('a','e','i','o','u') Digit= (0,1,2,3,4,5,6,7,8,9) cons=set(('b','c','d','f','g','h','j','k','l','m','n','p','q','r','s','t','v','w','x','y','z')) characters= ('!','@','#','$','%','^','&','*','.') new_sentence = [] for word in words: if word: if word[0] == " ": new_word=word else: if word[0] in Vowels: new_word= word+"way" elif word[0] in Digit: new_word= word elif word[0] in cons: first_letter=word[0] #saves the first letter change= str(word) #change to string rem= change.replace(first_letter,'') put_last= rem+first_letter #add letter to end new_word= put_last+"ay" elif word[0] in characters: new_word= word new_sentence.append(new_word) else: new_sentence.append(word) return sep.join(new_sentence)+end 加入
  • 只是过滤掉空字,但无论如何都要把它放在列表中
  • 很多join而不是elif
  • 使用if来获取更快的查询费用

现在:

set

的产率:

print(simple_pig_latin("hello world",sep='l'))