Python 为什么索引超出了';在';代码行?
我有下面的代码来删除任何输入字符串的元音:Python 为什么索引超出了';在';代码行?,python,if-statement,Python,If Statement,我有下面的代码来删除任何输入字符串的元音: def disemvowel(string_): vowels = ['a', 'e', 'i','o','u'] for i in range(len(string_)): if string_[i] in vowels: string_ = string_.replace(string_[i],"") return string_
def disemvowel(string_):
vowels = ['a', 'e', 'i','o','u']
for i in range(len(string_)):
if string_[i] in vowels:
string_ = string_.replace(string_[i],"")
return string_
我似乎不明白为什么在“if string_I]in元音:”行中出现“索引超出范围”错误;是因为字符串长度和元音列表可能不匹配吗
我对上述代码的理解是,我们将获取输入字符串中的每个字符,并检查它是否与列表元音中的任何项目匹配,如果匹配,则执行。。。还是我误解了“in”的用法?解决方案:
这只是如何更换它们的问题,这里有一个快速解决方案:
def disemvowel(字符串):
元音=['a','e','i','o','u']
字符串=列表(字符串)
对于范围内的i(len(string_)):
如果元音中的字符串[i]:
字符串[i]=“”
返回“”。加入(字符串)
def DISEMVOWEWL2(字符串):
元音=['a','e','i','o','u']
返回“”。join([字符串中的字母对应字母uuu,如果字母不在元音中])
s=“asdlkjsadkflja”
打印(不打印)
打印(不打印)
注意第二个例子,通过使用列表理解,您可以简化disemvowel
函数
关于每个步骤如何工作的说明:
'.join(['a','b','c','d'])
将列表中的字符连接在一起,将“”放置在每个字符之间->'abcd'
列表(字符串)
将'abcd'
转换为['a'、'b'、'c'、'd']
如果
string\uu
是一个列表,那么string\ui]='
将字符i
设置为空字符串。这是因为您正在动态更改字符串,因此它的长度也会更改。相反,试试这个
def disemvowel(string_):
vowels = ['a', 'e', 'i', 'o', 'u']
new_string = ''
for i string_:
if i not in vowels:
new_string += i
return new_string
这是因为您正在更改
string\uu
每次通过循环时引用的字符串。因此字符串的实际长度在变化,而迭代次数由初始长度固定
比如说。给定字符串“rata tat tat”
,当您将其作为范围调用的参数调用时,它将具有len(string_)==12
。因此循环将迭代12次
第一关:
string_==“rata tat”和i==0
->字符串[i]=“r”
->字符串[i]不是元音
->无操作
第二关:
string_==“rata tat”和i==1
->字符串[i]=“a”
->元音中的字符串[i]
->字符串==“rt tt”
第三关:
string_==“rt tt”和i==2
->字符串[i]==“”
->字符串[i]不是元音
->无操作
第4次到第8次迭代也不会有任何效果,但在第9次迭代中,您的算法将有:
第九关:
string_==“rt tt”和i==8
->i==len(字符串_u1)
->字符串[i]引发一个IndexOutfrance
您需要修改算法,使其改为对元音进行操作,替换目标字符串中的每个元音。一条附加注释,string\uu。replace
将把string\ui]的所有实例替换为“”
,因此您这样做实际上是在缩短字符串。但您仍在迭代字符串的原始长度。最终,您将检查索引10,但您已将字符串缩短为比这短,并且您将得到一个索引超出范围的错误。这可能是索引超出范围
错误产生的原因。下面添加了问题的解决方案。顺便说一句,您不应该构建像new_string+=i
这样的字符串,尽管这可能不会有太大的区别,因为您将元音替换为“”,这意味着字符串的长度每次减少1,并且因为for循环一直遍历到字符串的旧长度,它抛出索引超出范围的错误。
def disemvowel(string_):
vowels = ['a', 'e', 'i', 'o', 'u']
new_string = ''
for i string_:
if i not in vowels:
new_string += i
return new_string