Вот источник вашей ошибки:
...
for number in list1:
if number - list1[i+1] != -1:
...
i += 1
По существу, наступает момент (который является последним number
в list1
), когда i+1
выводит вас за пределы и Вы не делаете ничего, чтобы предотвратить это. Индексирование сложно, поэтому я хотел бы предложить подход без индексации (ну, почти). Кстати, из вашего комментария к ответу Bonfire я вижу, что задача состоит в том, чтобы изменить оригинальные списки на месте. В то время как изменение аргументов считается очень плохой практикой кодирования в наши дни, вот относительно эффективный способ сделать это:
import typing as t
def complete_sequence(partial: t.List[int]) -> t.List[int]:
# edge case
if len(partial) < 2:
return partial
# a lookup table for numbers we already have
observed = set(partial)
# append numbers we don't have
start = partial[0]
stop = partial[-1]
num = start + 1
while num < stop:
if not num in observed:
partial.append(num)
num += 1
# in-place sort
partial.sort()
return partial
Как видите, вместо вставки значений между существующими числами (оплачивая O (n) время для каждой вставки) мы можем просто добавить все (O (1) на вставку) и отсортировать. Это не только упрощает логику c (нам больше не нужно отслеживать эти надоедливые индексы), но и уменьшает сложность вычислений по времени с O (n ^ 2) до O (n * log (n)).