Python访问字符串索引超出范围

时间:2015-10-22 18:33:56

标签: python

我昨天发布了关于字符串索引超出范围的完全相同的问题,但我只是看不到我在哪里访问超出范围的索引。我正在创建一个能够取出字符串中所有元音的函数。

function CBS($digits, $n_times) {
    $mask = 0x7FFFFFFF;
    $digits = intval($digits);
    if($n_times > 0) {
        $digits = ($digits<<$n_times%32) & (($digits>>(32-$n_times%32)) & ($mask>>(31-$n_times%32)));
    }elseif($n_times < 0) {
        $n_times = abs($n_times);
        $digits = (($digits>>$n_times%32) & ($mask >> (-1+$n_times%32))) | ($digits<<(32-$n_times%32));
    }
    return decbin($digits);
}

这是一个错误。我正在从0迭代到文本的长度,包括在内,我只是用一个空字符串替换每个元音。这有什么问题?

4 个答案:

答案 0 :(得分:4)

在第一个元音之后,您会发现text的长度将减1,而您的循环假定text的长度不变。

这样做的更加pythonic方式是''.join(c for c in text if c not in 'aeiouAEIOU')

答案 1 :(得分:1)

您通过删除内容来更改text,所以当您接近结尾时,由于您缩短了字符串,因此不再存在结束。

您似乎也不了解replace的作用。它取代了给定字符串的所有次出现,因此您根本不需要迭代字符串。只需遍历要替换的字符:

def anti_vowel(text):
    for char in "aeiouAEIOU":
        text = text.replace(char, "") 
    return text

当然,可能有更好的方法来达到相同的结果(正如其他答案所述)。

答案 2 :(得分:1)

在您的示例中,range(0, len(text))在循环开始时只运行一次。它不会在for循环的每次迭代中运行。

在循环中,您缩短了变量text的长度,因此每次迭代时text的原始长度都会缩短。最终,您将达到text的长度小于用于在索引中搜索的索引的点。

答案 3 :(得分:1)

主要问题是每个元音的长度不断变化。解决此问题的一个选项是创建一个新字符串,该字符串是旧字符串的副本,然后编辑副本。