Как дать дополнительные аргументы для функции Python itertools.ifilter? - PullRequest
1 голос
/ 20 марта 2010

В Python у меня есть следующая функция:

def is_a_nice_element(element, parameter):
    #do something
    return True or False

Теперь я хотел бы отфильтровать список с помощью этой функции в качестве предиката, давая фиксированный параметр. В Python есть функция itertools.ifilter, но я не могу понять, как передать параметр. Это возможно? Если нет, то как я могу решить эту проблему?

Ответы [ 4 ]

4 голосов
/ 20 марта 2010

Мне нравится functools.partial намного лучше, чем lambda.

itertools.ifilter( partial(is_a_nice_element, parameter=X), iterable )
3 голосов
/ 20 марта 2010

Оберните это в lambda:

itertools.ifilter(lambda e: is_a_nice_element(e, 42), iterable)

42 - ваш дополнительный аргумент, или как вы хотите, чтобы он был.

1 голос
/ 20 марта 2010

Решения, использующие lambda и functools.partial, совершенно правильные и прямо отвечают на ваш вопрос, но я не думаю, что они действительно идеальное решение.

Использование filter / itertools.ifilter / map / itertools.imap с анонимной функцией всегда намного менее понятно, чем использование выражения генератора или понимания списка. Например, в этом случае я бы написал выражение генератора

(item for item in iterable if is_a_nice_element(item, constant))

вместо использования ifilter. В этом случае решение ifilter все еще довольно читабельно, но во многих случаях попытка решить множество проблем, связанных с определением только правильной функции, не будет столь же полезной, как просто выполнение операции.

0 голосов
/ 20 марта 2010

Если вы используете ifilter, тогда параметр должен быть постоянным, в этом случае вы можете использовать аргумент по умолчанию parameter=something. Если вы хотите, чтобы параметр менялся, вам нужно использовать другой метод для получения двоичного предиката.

Если у вас уже есть список в руках, ifilter немного излишне по сравнению со встроенным фильтром .

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

...