Python

Почему list index out of range? что надо исправить?

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

Напишите программу, которая по данной ситуации определяет, сколько шариков будет "уничтожено". Естественно, непрерывных цепочек из трех и более одноцветных шаров в начальный момент может быть не более одной.


crush=1
count=0
L = [int(num) for num in input().split()]

for i in range(1,len(L)):
if L[i]==L[i-1]:
crush+=1
elif crush>2:
for k in range(crush):
del L[i-k-1]
count+=crush
crush=1

print(count)
Потому, что в конструкции range(1,len(L)) верхняя граница цикла - len(L) - фиксируется в момент начала цикла и дальше никак не меняется. А реальная длина L в процессе работы уменьшается.
 cur = list(map(int, input().split())) + ['@']
lng, old = len(cur), []
while len(cur) != len(old):
old, pos = cur, 0
for i in range(1, len(cur)):
if cur[i] == cur[i - 1]: continue
if i - pos < 3: pos = i
else:
cur = cur[:pos] + cur[i:]
break
print(lng - len(cur))
 L = list(map(int, input().split())) + ['@']
lng, pos, i = len(L), 0, 1
while i < len(L):
if L[i] == L[i - 1]: i += 1
elif i - pos < 3: pos, i = i, i + 1
else:
L, i = L[:pos] + L[i:], pos
while pos > 0 and L[pos - 1] == L[i]: pos -= 1
print(lng - len(L))
AM
Azamat Merzayanov
52 961
Лучший ответ
Ошибка "list index out of range" возникает, потому что вы удаляете элементы из списка `L` внутри цикла `for k in range(crush)`, и после удаления элементов длина списка `L` уменьшается. Это может привести к тому, что в какой-то момент индекс `i` станет больше, чем новая длина списка `L`, и возникнет ошибка "list index out of range".

Чтобы исправить эту ошибку, вы можете переписать ваш код таким образом:

```python
crush = 1
count = 0
L = [int(num) for num in input().split()]

i = 1
while i < len(L):
if L[i] == L[i - 1]:
crush += 1
elif crush > 2:
del L[i - crush:i]
count += crush
crush = 1
i -= crush
else:
i += 1

print(count)
```

В этой версии кода мы используем `while` цикл вместо `for` цикла, чтобы управлять индексом `i` вручную и избежать проблемы с выходом за пределы списка. Кроме того, мы используем `del` для удаления элементов внутри списка, но корректно обновляем значение `i` после удаления элементов.
Руслан Краснов ясно, спасибо! а в строчке del L[i - crush:i] имеется в виду del L[i - crush-1]? и еще почему то исправленная программа в бесконечный цикл уходит
Руслан Краснов на примере 5 1 3 3 3 2 он уходит в цикл бесконечный