Как исправить ошибку 'String index out of range' - PullRequest
1 голос
/ 02 июня 2019

Я пытаюсь написать код, который заменяет повторяющиеся символы в строке символом и числом его повторений (например: «aaaaggggtt» -> «a4g4t2»). Но я получаю строковый индекс вне диапазона ошибки ((

seq = input()
i = 0
j = 1
v = 1
while j<=len(seq)-1:
  if seq[i] == seq[j]:
    v += 1
    i += 1
    j += 1
  elif seq[i] != seq[j]:
    seq.replace(seq[i-v:j], seq[i] + str(v))
    v = 1
    i += 1
    j += 1
print(seq)

строка 6, в если seq [i] == seq [j]: IndexError: строковый индекс вне диапазона

UPD: после изменения len (seq) на len (seq) -1 больше нет ошибки индекса строки, но код по-прежнему не работает. Ввод: aaaaggggtt
Выход: aaaaggggtt (то же самое)

Ответы [ 2 ]

0 голосов
/ 02 июня 2019

простой способ:

str1 = 'aaaaggggtt'

set1 = set(str1)

res = ''

for i in set1:

    res+=i+str(str1.count(i))

print(res)
0 голосов
/ 02 июня 2019

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

s = 'aaaaggggtt'

res = ''
counter = 1

#Iterate over the string
for idx in range(len(s)-1):
    #If the character changes
    if s[idx] != s[idx+1]:
        #Append last character and counter, and reset it
        res += s[idx]+str(counter)
        counter = 1
    else:
        #Else increment the counter
        counter+=1

#Append the last character and it's counter
res += s[-1]+str(counter)
print(res)

Или вы можете подойти к этому, используя itertools.groupby

from itertools import groupby

s = 'aaaaggggtt'

#Count numbers and associated length in a list
res = ['{}{}'.format(model, len(list(group))) for model, group in groupby(s)]

#Convert list to string
res = ''.join(res)

print(res)

Выход будет

a4g4t2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...