Ошибка индекса: список индексов вне диапазона в Python 3 для конкретных тестовых случаев даже после создания угловых случаев

#python #python-3.x #algorithm #runtime-error #testcase

#питон #python-3.x #алгоритм #ошибка во время выполнения #testcase

Вопрос:

Я пытался решить проблему на Python и столкнулся с некоторыми проблемами с определенным набором тестовых примеров, которые:

 5

qwertyuioplkjhgfdsazxcvbnm

aaaaaaaaaaaaaaaaaaaaaaaaaa

aaaabbbbbbbaaaabbbbbbaaaab

zszsdasldnaosdihafalsssadf

jdflsddjddjlasdjsasjsjssjs
 

Мой код был:

 tc = int(input())
for tc_ct in range(tc):
    s = input()
    edited_s = []
    for elm in s:
        edited_s.append(elm)
    if len(set(edited_s)) == 1 and len(edited_s) > 1:
        for output in set(edited_s):
            print(output)
    else:    
        n = len(edited_s)
        for i in range(n-1):
            if i < n-1 and s[i] == s[i 1]:
                    del edited_s[i]
        print("".join(edited_s))
 

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

Комментарии:

1. Пожалуйста, обновите свой вопрос с полным обратным отслеживанием ошибок.

Ответ №1:

Ваша программа дедуплицирует последовательные символы в слове.

Вы сталкиваетесь с ошибками в else-statement , потому что вы удаляете элементы в списке, одновременно читая его в том же цикле.

Таким образом, размер списка меняется после прохождения цикла, когда из него удаляется символ.

Вы можете обойти это, создав копию списка, одну для итерации, а другую для удаления элементов.

Тем не менее, я рекомендую составить список результатов и добавлять к нему постепенно. В else-statement вашем if-expression вы можете составить список.

Добавляйте символ в этот список только тогда, когда ранее добавленный символ в списке не является текущим.

 dedup_word = [None,] 

word = input()

for current_entry in word:
    previous_entry = dedup_word[-1]
    if previous_entry != current_entry:
        dedup_word.append(current_entry)

output = ''.join(filter(None, dedup_word))
print(output)
 

Вы могли бы даже реорганизовать свою текущую программу, и else-statement после прочтения вашего ввода тело будет основной программой.