Не могу понять почему мой правильно написанный код не работает. Python

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

inp = list(input())

i = 0

while i != len(inp):
    if not inp[i].isalnum():
        del inp[i]
        
    i+=1

print(inp)


Ответы (3 шт):

Автор решения: Zhihar

сколько раз повторять - НЕЛЬЗЯ удалять элементы списка по которому вы при этом еще и двигаетесь!!!

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

res = ''.join(letter for letter in input() if letter.isalnum())

print(res)

P.S.

а у вас происходит следующее - вы удаляете элемент, список уменьшается на 1 элемент, вы при этом делаете еще i += 1, т.е. еще на 1 символ сдвигаетесь, так что во-первых часть символов будет выпадать из анализа, а во вторых появляется шанс просто попасть уже за пределы списка

→ Ссылка
Автор решения: eri

Потому как длинна меняется и i оказывается за границами на последних операциях. Проход по списку или строке с удалением только в обратном направлении:

i = len(inp)
while i:
    i-=1
    if not inp[i].isalnum():
        del inp[i]

И это тоже является плохим кодом.

Используйте только фильтры для таких задач:

inp = ''.join(filter(lambda x: x.isalnum(), inp))

Еще плохой, но рабочий вариант:

i = 0
while i != len(inp):
    if not inp[i].isalnum():
        del inp[i]
    else:
        i+=1
→ Ссылка
Автор решения: CrazyElf

В данном случае можно просто вынести i+=1 в блок else:

inp = list(input())
i = 0
while i != len(inp):
    if not inp[i].isalnum():
        del inp[i]
    else:
        i+=1
print(inp)

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

→ Ссылка