Как мой код python выходит из-под контроля? - PullRequest
0 голосов
/ 13 марта 2020

Я пытался закодировать строку (ex: aabbbacc) во что-то вроде a2b3a1c2 это код, который я пробовал:

string_value = "aabbbacc"
temp_string = ""
for i in range(0, len(string_value)):
    if i != len(string_value) or i > len(string_value):
        temp_count = 1
        while string_value[i] == string_value[i+1]:
            temp_count += 1
            i += 1
        temp_string += string_value[i] + str(temp_count)
print(temp_string)

проблема в том, что я добавил if условие, чтобы не выходить за пределы возможного, я все еще получаю ошибку

Traceback (most recent call last):
  File "C:run_length_encoding.py", line 6, in <module>
    while string_value[i] == string_value[i+1]:
IndexError: string index out of range

Я также пытался

string_value = "aabbbacc"
temp_string = ""
for i in range(0, len(string_value)):
    count = 1
    while string_value[i] == string_value[i+1]:
        count += 1
        i += 1
        if i == len(string_value):
            break
    temp_string += string_value[i]+ str(count)
print(temp_string)

сейчас, я знаю, что мог бы быть лучший способ решить эту проблему, но я пытаюсь понять, почему я получаю исключение вне пределов, хотя у меня есть условие if, чтобы предотвратить его, в какой части лога c я иду не так, пожалуйста, объясните ...

Ответы [ 3 ]

2 голосов
/ 13 марта 2020

Во-первых, эта проверка нечетна:

if i != len(string_value) or i > len(string_value):

Во-вторых, вы проверяете i, но читаете значение для i + 1 и, возможно, затем ...

Поэтому я предлагаю поставить условие внутри вашего while.

И не позволяйте читать string_value [i] после того, как вы проверили, что i == len (string_value).

(напоминаю, что: оператор break, как и в C, вырывается из самой внутренней оболочки для или пока l oop. ")

1 голос
/ 13 марта 2020

Переберите каждый символ в строке, затем проверьте, совпадает ли следующий символ с текущим. Если да, то добавьте еще один, добавьте счетчик во временную строку и сбросьте счетчик до 1.

string_value = "aabbbacc"
temp_string = ""
count = 1
for i in range(len(string_value)-1):
    if string_value[i] == string_value[i+1]:
        count += 1
    else:
        temp_string += string_value[i]+ str(count)
        count = 1

#add the last char count
temp_string += string_value[i+1]+ str(count)

print(temp_string)
Out:  a2b3a1c2
1 голос
/ 13 марта 2020

Проблема здесь:

for i in range(0, len(string_value)): # if i is the last index of the string
    count = 1
    while string_value[i] == string_value[i+1]: # i+1 is now out of bounds

Самый простой способ избежать выхода за пределы - вообще не индексировать строки:

def encode(s):
    if s == '':   # handle empty string
        return s
    current = s[0]  # start with first character (won't fail since we checked for empty)
    count = 1
    temp = ''
    for c in s[1:]:  # iterate through remaining characters (string slicing won't fail)
        if current == c:
            count += 1
        else: # character changed, output count and reset current character and count
            temp += f'{current}{count}'
            current = c
            count = 1
    temp += f'{current}{count}'  # output last count accumulated
    return temp

print(encode('aabbbacc'))
print(encode(''))
print(encode('a'))
print(encode('abc'))
print(encode('abb'))

Вывод:

a2b3a1c2

a1
a1b1c1
a1b2
...