Как удалить букву из списка?
a="Don't panic!"
a=list(a)
for x in a:
if x not in "on tap":
a.remove(x)
print(a)
Объясните пожалуйста почему не удаляется буква "c" из списка. Ведь её нет в строке "on tap"
Ответы (4 шт):
Потому что Ваш код изменяет (уменьшает) список во время итерирования по нему.
Добавьте вывод x в цикле, и Вы увидите что происходит.
a="Don't panic!"
a=list(a)
for x in a:
print(x) # !!!
if x not in "on tap":
a.remove(x)
print(a)
Используйте генераторы вместо for:
new_a = [x for x in a if x in "on tap"]
print(new_a)
Потому, что вы меняете прямо список, которым вы проходите. Вы постепенно получаете такие списки:
['D', 'o', 'n', "'", 't', ' ', 'p', 'a', 'n', 'i', 'c', '!']
['o', 'n', "'", 't', ' ', 'p', 'a', 'n', 'i', 'c', '!']
['o', 'n', 't', ' ', 'p', 'a', 'n', 'i', 'c', '!']
['o', 'n', 't', ' ', 'p', 'a', 'n', 'c', '!']
['o', 'n', 't', ' ', 'p', 'a', 'n', 'c']
что лучше видимо в строковой форме
Don't panic!
on't panic!
ont panic!
ont panc!
Нужно проходит по копии списка, которую очень просто получите, когда добавите к нему [:]
a = "Don't panic!"
a = list(a)
for x in a[:]: # <----- Здесь разница!
if x not in "on tap":
a.remove(x)
print(a)
print("".join(a)) # Может быть, что вы хотели вывести строку
Вывод:
['o', 'n', 't', ' ', 'p', 'a', 'n'] ont pan
Наиболее подходящей для вашей задачи является стандартная функция filter() (см. здесь):
a = "Don't panic!"
a = "".join(filter(lambda c : c not in "on tap", a))
print(a)
Первый аргумент — функция, которая применяется к каждому элементу, и в итоговый генератор попадают только отфильтрованные по ней. .join() нужен для соединения элементов в одну строку