我构建了这个函数来将字符串输入更改为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语句都不起作用。它会告诉我对象不是可订阅的。
答案 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'))