Странно работает перебор и удаление из списка
Есть функция, которая перебирает список и удаляет те значения, которые есть в другом списке.
geese = ["African", "Roman Tufted", "Toulouse", "Pilgrim", "Steinbacher"]
def goose_filter(birds):
for bird in birds:
if bird in geese:
birds.remove(bird)
return birds
Задаю значение:
print(goose_filter(['Pilgrim', 'pooe', 'Roman Tufted', 'Toulouse', 'African', 'gool']))
И выдает:
['pooe', 'Toulouse', 'gool']
Не понимаю, почему именно не было удалено 'Toulouse'. Пробовал разные варианты, список ведет себя странно и не удаляет какие-то элементы, иногда работает.
Ответы (3 шт):
Автор решения: Utsiye
→ Ссылка
Вы берете за основу цикла массив, который в процессе меняете, легче всего просто создать новый список только с теми словами, которых нет в фильтре:
geese = ["African", "Roman Tufted", "Toulouse", "Pilgrim", "Steinbacher"]
z=[]
def goose_filter(birds,empy_list):
for bird in birds:
if bird in geese:
pass
else:
z.append(bird)
return z
print(goose_filter(['Pilgrim', 'pooe', 'Roman Tufted', 'Toulouse', 'African', 'gool'],z))
Автор решения: V Vostokov
→ Ссылка
Необходимо было отсортировать список в цикле:
for bird in sorted(birds):
Или поменять местами в цикле листы:
for bird in geese:
if bird in birds:
Автор решения: Сергей Ш
→ Ссылка
geese = ["African", "Roman Tufted", "Toulouse", "Pilgrim", "Steinbacher"]
def goose_filter(birds):
return [x for x in birds if x not in geese]
print(goose_filter(['Pilgrim', 'pooe', 'Roman Tufted', 'Toulouse', 'African', 'gool']))
['pooe', 'gool']