Почему не работает метод .remove() python

Почему-то метод remove оставляет объекты. Вот код.

phrase = "Don't panic!"
plist = list(phrase)
for i in plist:
    if i not in list('on tap'):
        plist.remove(i)
print(plist)

Вот что выдает: ['o', 'n', 't', ' ', 'p', 'a', 'n', 'c']. Как видите, элемент 'c' не удалён из списка. Не понимаю почему. Буду рад, если объясните


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

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

Логичней будет так:

phrase = "Don't panic!"
exception = "on tap"

plist = [i for i in phrase if i in exception]

print(plist)

Как правильно указали в комментариях, вы удаляете элементы из списка, по которому итерируетесь, из за этого код и работает некорректно.

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

В данном случае вы идете по списку, удаляете элемент, а итератор i после удаления перепрыгивает. Так совпало что, это один из последних элементов. Измените Don't на Dyn't и у вас 'y' так же не удалиться. Можно так изменить ваш код.

phrase = "Don't panic!"
plist = list(phrase)
run_list = list(phrase) // для итератора.

for i in run_list:
    if i not in list('on tap'):
       plist.remove(i)

print(plist)

Но с генератором списка изящней.

→ Ссылка