Следующий создатель декодера работает с любой разумной базой, имеет гораздо более аккуратный цикл и дает явное сообщение об ошибке, когда он встречает недопустимый символ.
def base_n_decoder(alphabet):
"""Return a decoder for a base-n encoded string
Argument:
- `alphabet`: The alphabet used for encoding
"""
base = len(alphabet)
char_value = dict(((c, v) for v, c in enumerate(alphabet)))
def f(string):
num = 0
try:
for char in string:
num = num * base + char_value[char]
except KeyError:
raise ValueError('Unexpected character %r' % char)
return num
return f
if __name__ == "__main__":
func = base_n_decoder('0123456789abcdef')
for test in ('0', 'f', '2020', 'ffff', 'abqdef'):
print test
print func(test)
Как объяснил ответ Дэвида , вам необходимо динамически проверить наличие line.length()
, чтобы учесть преобразование вашей строковой строки. Это объясняет вне диапазона.
Тем не менее, здесь есть еще две проблемы.
Первый - это когда стоп-слово находится в конце строки без пробела после . Этот случай в настоящее время пропущен.
Второй - когда строка начинается с последовательности символов стоп-слова, но продолжается чем-то иным, кроме пробела (например, «Затем» вместо «The»). В таком случае замена в настоящее время имеет место, а не должна.
Вы можете решить две проблемы следующим образом:
for(int j=0 ;j<=line.length()-length_of_stopword;j++){
if ( j+length_of_stopword<=line.length()){
if ((j==0 || line[j-1]==' ') && (j+length_of_stopword==line.length()
|| line[j+length_of_stopword]==' ' ) ) {
if(line.substr(j,length_of_stopword)==word){
line.replace(j,length_of_stopword,"*");
no_of_occurence++;
}
}
}
}
Когда вы удаляете слово, длина строки уменьшается. Но вы все еще продолжаете цикл до исходной длины строки. Простое решение - избавиться от length_of_line
и вызывать line.length()
везде, где вам нужна длина.