Как предоставить дополнительные аргументы для функции Python itertools.ifilter?
Вопрос
В python у меня есть следующая функция:
def is_a_nice_element(element, parameter):
#do something
return True or False
Теперь я хотел бы отфильтровать список с помощью этой функции в качестве предиката, указав фиксированный параметр.В Python есть функция itertools.ifilter, но я не могу понять, как передать параметр.Возможно ли это?Если нет, то как я могу решить эту проблему?
Решение
Заверните его в lambda
:
itertools.ifilter(lambda e: is_a_nice_element(e, 42), iterable)
42 - это ваш дополнительный аргумент, или что бы вы еще ни хотели, чтобы это было.
Другие советы
Мне нравится функциональные средства.частичные намного лучше , чем lambda
.
itertools.ifilter( partial(is_a_nice_element, parameter=X), iterable )
Решения используют lambda
и functools.partial
они вполне корректны и прямо отвечают на ваш вопрос, но я не думаю, что они действительно являются идеальным решением.
Используя filter
/itertools.ifilter
/map
/itertools.imap
использование анонимной функции в значительной степени всегда будет менее понятным, чем использование выражения генератора или понимания списка.Например, в этом случае я бы написал выражение генератора
(item for item in iterable if is_a_nice_element(item, constant))
вместо того, чтобы использовать ifilter
.В этом случае ifilter
решение по-прежнему достаточно читаемо, но во многих случаях пытаться пройти через множество трудностей, чтобы определить только правильную функцию, будет не так полезно, как просто выполнять операцию.
Если вы используете ifilter
тогда параметр должен был бы быть постоянным, и в этом случае вы могли бы использовать аргумент по умолчанию parameter=something
.Если вы хотите, чтобы параметр менялся, вам нужно было бы использовать другой метод для получения двоичного предиката.
Если у вас уже есть список на руках, ifilter
это немного излишне по сравнению со встроенным Фильтр.
Описание того, чего вы хотите достичь, помогло бы дать более конкретный ответ.