我昨天发布了关于字符串索引超出范围的完全相同的问题,但我只是看不到我在哪里访问超出范围的索引。我正在创建一个能够取出字符串中所有元音的函数。
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迭代到文本的长度,包括在内,我只是用一个空字符串替换每个元音。这有什么问题?
答案 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)
主要问题是每个元音的长度不断变化。解决此问题的一个选项是创建一个新字符串,该字符串是旧字符串的副本,然后编辑副本。