IndexError: string index out of range, как решить?

golji2

Новичок
Пользователь
Окт 6, 2021
3
0
1
Мой код:
Код:
m=str(input())
r=len(m)
t=0
x=0
f=' '
a1='a'
b2='b'
c3='c'
while t<=r:
    if m[t]=='a':
        t+=1
        x+=1
        if m[t]!='a':
            x=str(x)
            f+=a1+x
            x=int(x)
            x=0
    if m[t]=='b':
        t+=1
        x+=1
        if m[t]!='b':
            x=str(x)
            f+=b2+x
            x=int(x)
            x=0
    if m[t]=='c':
        t+=1
        x+=1
        if m[t]!='c':
            x=str(x)
            f+=c3+x
            x=int(x)
            x=0
print(f)

Ошибка:
Error:
Traceback (most recent call last):
File "jailed_code", line 13, in <module>
if m[t]!='a':
IndexError: string index out of range
Прохожу курс, задали задание, я сделал( код на этом сайте съехал ), при запуске выскакивает ошибка. Подскажите, как решить.
Операционная система: Windows 10
Вот задание которое делаю:
Узнав, что ДНК не является случайной строкой, только что поступившие в Институт биоинформатики студенты группы информатиков предложили использовать алгоритм сжатия, который сжимает повторяющиеся символы в строке.
Кодирование осуществляется следующим образом:
s = 'aaaabbсaa' преобразуется в 'a4b2с1a2', то есть группы одинаковых символов исходной строки заменяются на этот символ и количество его повторений в этой позиции строки.
Напишите программу, которая считывает строку, кодирует её предложенным алгоритмом и выводит закодированную последовательность на стандартный вывод. Кодирование должно учитывать регистр символов.
Sample Input 1:
aaaabbcaa
Sample Output 1:
a4b2c1a2
Sample Input 2:
abc
Sample Output 2:
a1b1c1
Прошу без сообщений по типу: "Я бы такой код написал..... ". Хочу решить сам, поэтому прошу только подсказку, как возможно это решить, а не готовый код.
 
Последнее редактирование:

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 595
461
83
ошибка говорит о том, что вы вышли за пределы строки
и было бы неплохо описать результат, который вы хотите увидеть

вставьте код как код, соблюдая отступы, подробнее тут как задать вопрос
 
Последнее редактирование:

golji2

Новичок
Пользователь
Окт 6, 2021
3
0
1
ошибка говорит о том, что вы вышли за пределы строки
и было бы неплохо описать результат, который вы хотите увидеть

вставьте код как код, соблюдая отступы, подробнее тут как задать вопрос
Вроде бы, лучше составил вопрос.
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 595
461
83
Вроде бы, лучше составил вопрос.
поменяйте условие цикла while на равенство, ошибки не будет...
но ваш код задачу не решает...
вам нужно проходить строку через цикл for и проверять, если следующий символ такой же, то добавлять единицу, иначе начинаем с нового символа...
вам поможет метод enumerate...
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 595
461
83
хотя нет, enumerate усложняет все, можно проще...
но ваш код все равно не верен в корне...
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 595
461
83
могу предложить два варианта
Python:
# ====================================================================
# Первый варинат
string = input()
result = ""
string = string + '1'
symbol = string[0]
count = 0
for i in string:
    if symbol != i:
        result += symbol + str(count)
        symbol = i
        count = 0
    count += 1
print(result)
# ====================================================================

# ====================================================================
# Второй варинат
string = input()
string = string + '1'
count = 1
result = ""
for index, value in enumerate(string):
    if index + 1 >= len(string):
        break
    if value != string[index + 1]:
        result += value + str(count)
        count = 0
    count += 1
print(result)
# ====================================================================
 

golji2

Новичок
Пользователь
Окт 6, 2021
3
0
1
могу предложить два варианта
Python:
# ====================================================================
# Первый варинат
string = input()
result = ""
string = string + '1'
symbol = string[0]
count = 0
for i in string:
    if symbol != i:
        result += symbol + str(count)
        symbol = i
        count = 0
    count += 1
print(result)
# ====================================================================

# ====================================================================
# Второй варинат
string = input()
string = string + '1'
count = 1
result = ""
for index, value in enumerate(string):
    if index + 1 >= len(string):
        break
    if value != string[index + 1]:
        result += value + str(count)
        count = 0
    count += 1
print(result)
# ====================================================================
Спасибо за помощь. Попрошу, когда вы будете свободны решить вот эту задачу:
Когда Павел учился в школе, он запоминал таблицу умножения прямоугольными блоками. Для тренировок ему бы очень пригодилась программа, которая показывала бы блок таблицы умножения.
Напишите программу, на вход которой даются четыре числа aa, bb, cc и dd, каждое в своей строке. Программа должна вывести фрагмент таблицы умножения для всех чисел отрезка [a; b][a;b] на все числа отрезка [c;d][c;d].
Числа aa, bb, cc и dd являются натуральными и не превосходят 10, a \le ba≤b, c \le dc≤d.
Следуйте формату вывода из примера, для разделения элементов внутри строки используйте '\t' — символ табуляции. Заметьте, что левым столбцом и верхней строкой выводятся сами числа из заданных отрезков — заголовочные столбец и строка таблицы.
Sample Input 1:
7
10
5
6
Sample Output 1:
5 6
7 35 42
8 40 48
9 45 54
10 50 60
Sample Input 2:
5
5
6
6
Sample Output 2:
6
5 30
Sample Input 3:
1
3
2
4
Sample Output 3:
2 3 4
1 2 3 4
2 4 6 8
3 6 9 12
Прошу, потому что интересно, как её решит специалист с опытом. Вот моё решение:
Код:
a, b, c, d= int(input()), int(input()), int(input()), int(input())
f, z=len(range(c,d+1)), len(range(a,b+1))
v=a
x=c
for p in range(c, d+1):
    print('\t',p, end='\t')
print()   
while v<=b:
    print(v, end=" ")
    for h in range(f):
        print('\t', v*x, end='\t')
        x+=1
    if x>d:
        print()
        x=c
        v+=1
 

regnor

Модератор
Команда форума
Модератор
Июл 7, 2020
2 595
461
83
можно решить через два цикла for
Python:
a, b, c, d = int(input()), int(input()), int(input()), int(input())
for i in range(c, d + 1):
    print(str(i), end="\t")
print(end='\n')
for i in range(a, b + 1):
    print(str(i) + '\t', end='')
    for j in range(c, d + 1):
        print(str(i * j), end='\t')
    print(end='\n')


а тут тоже два цикла for, только запись компактнее
Python:
a, b = range(int(input()), int(input()) + 1), range(int(input()), int(input()) + 1)
print(*b, sep="\t")
for i in a:
    print(i, *(i * j for j in b), sep="\t")
 

Форум IT Специалистов