Не могу понять почему мой правильно написанный код не работает. Python
Мой код должен проверять литерал строки на наличие сторонних символов, таких как "+","&","@" и т.д. Но когда я ввожу их, то удаляется лишь определенная часть, и к тому же, если ввести один символ "+" в инпут, то произойдет ошибка. Пожалуйста, обьясните почему код не удаляет копии одного символа, то есть все символы. Прошу, помогите разобраться, я уже совсем отчаялся.
inp = list(input())
i = 0
while i != len(inp):
if not inp[i].isalnum():
del inp[i]
i+=1
print(inp)
Ответы (3 шт):
сколько раз повторять - НЕЛЬЗЯ удалять элементы списка по которому вы при этом еще и двигаетесь!!!
и зачем вообще удалять символы, наоборот - оставляйте нужные символы и формируйте из них новую строку
res = ''.join(letter for letter in input() if letter.isalnum())
print(res)
P.S.
а у вас происходит следующее - вы удаляете элемент, список уменьшается на 1 элемент, вы при этом делаете еще i += 1, т.е. еще на 1 символ сдвигаетесь, так что во-первых часть символов будет выпадать из анализа, а во вторых появляется шанс просто попасть уже за пределы списка
Потому как длинна меняется и 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
В данном случае можно просто вынести 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)
Хотя другие отвечающие и комментаторы правы - лучше так не делать (не удалять элементы из списка по которому проходите), в других обстоятельствах это может привести к весьма неприятным багам.