Как предоставить дополнительные аргументы для функции Python itertools.ifilter?

StackOverflow https://stackoverflow.com/questions/2483118

  •  21-09-2019
  •  | 
  •  

Вопрос

В 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 это немного излишне по сравнению со встроенным Фильтр.

Описание того, чего вы хотите достичь, помогло бы дать более конкретный ответ.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top