Странно работает перебор и удаление из списка

Есть функция, которая перебирает список и удаляет те значения, которые есть в другом списке.

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']
→ Ссылка