Альтернативный подход к функциональному решению этой проблемы с преимуществом использования недавних дополнений к стандартной библиотеке (с использованием тех же имен файлов примера, что и у Троя Дж. Фаррелла в другом ответе):
>>> import operator, itertools
>>> filter_fun= operator.methodcaller("startswith", "doc")
>>> files = ["doc1.html", "doc2.html", "doc3.html", "index.html", "image.jpeg"]
>>> list(itertools.ifilterfalse(filter_fun, files))
['index.html', 'image.jpeg']
operator.methodcaller
, вызываемая с помощью methodname, [optional arguments]
, возвращает функцию, которая при вызове с объектом obj
в качестве аргумента возвращает результат obj.methodname(optional_arguments)
.
itertools.ifilterfalse
, в отличие от filter
, возвращает итератор вместо списка, и решение фильтра отменяется.