@dc65k

Как правильно обработать # IndexError: string index out of range?

Всем привет. Есть пример несложной задачи на JavaScript, акцент на строке:
const nextValue = string[i + 1]; // nextValue undefined

Переписав данный код на Python я столкнулся с:
print('nextValue', nextValue)  # IndexError: string index out of range

Подскажите, как правильно обработать данное обращение к несуществующему элементу?

Пример: JavaScript
const solution = (string) => {

  let accumulator = [];

  let count = 1;

  for (let i = 0; i < string.length; i++) {
    const currentValue = string[i];
    const nextValue = string[i + 1]; // nextValue undefined

    console.group('Group');
    console.log('currentValue', currentValue);
    console.log('nextValue', nextValue);
    console.groupEnd();

    if (currentValue === nextValue) {
      count += 1;
      continue;
    }

    accumulator.push(currentValue);

    if (count > 1) {
      accumulator.push(count);
    }

    count = 1;

    /*if (currentValue !== nextValue) {
      accumulator.push(currentValue);
      accumulator.push(count);
      count = 1;
    } else {
      count += 1;
    }*/
  }

  return accumulator.join('');
}

console.log(solution('WWAWWACBBBBII')); // => 'W2AW2ACB4I2'
// console.log(solution('ABBCCC')); // => 'AB2C3'


Пример: Python
def solution(string):
    accumulator = []

    count = 1

    for idx, currentValue in enumerate(string):
        # currentValue = string[i]
        nextValue = string[idx + 1]

        print('currentValue', currentValue)
        print('nextValue', nextValue)  # IndexError: string index out of range
        print('=====')

    if currentValue == nextValue:
        count += 1
        continue

    accumulator.append(currentValue)

    if count > 1:
        accumulator.append(count)

    count = 1

    return accumulator


# print(solution('WWAWWACBBBBII')) # => 'W2AW2ACB4I2'
print(solution('ABBCCC'))  # => 'AB2C3'
  • Вопрос задан
  • 131 просмотр
Решения вопроса 1
fenrir1121
@fenrir1121
Начни с документации
Обычно сравнивают с предыдущим символом, а не следующим, тогда и проблем с выходом за длину строки не возникнет
def compress(s: str) -> str:
    out = ''
    cnt = 1
    for i in range(1, len(s)):
        if s[i] == s[i - 1]:
            cnt += 1
        else:
            out += s[i - 1] + str(cnt) if cnt > 1 else s[i - 1]
            cnt = 1

    out += s[-1] + str(cnt) if cnt > 1 else s[-1]
    return out
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
sergey-gornostaev
@sergey-gornostaev Куратор тега Python
Седой и строгий
Правильно вообще не доводить до возможности появления такой ошибки. Например обойти строку функцией pairwise, чтобы индексы не понадобились.
Ответ написан
Vindicar
@Vindicar
RTFM!
Не перебирать в цикле строку до конца, а только до предпоследнего символа. Его обработать отдельно, если потребуется.
А вообще, я бы переписал по другому. Просто храни в переменной последний увиденный символ.
Тогда, пока ты идёшь по строке, у тебя есть два варианта:
а) текущий символ совпал с последним увиденным. нарасти счётчик повторов на 1.
б) текущий символ отличается. запиши счётчик в выходную строку, сбрось счётчик в 1, запомни текущий символ как последний.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы