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