2

在python中,我有以下功能:

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

现在我想用这个函数作为谓词过滤一个列表,给出一个固定的参数。Python 有 itertools.ifilter 函数,但我不知道如何传递参数。这可能吗?如果没有,我该如何解决这个问题?

4

4 回答 4

5

我喜欢functools.partiallambda.

itertools.ifilter( partial(is_a_nice_element, parameter=X), iterable )
于 2010-03-20T14:36:23.993 回答
3

把它包在一个lambda

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

42 是你的额外参数,或者你想要的任何其他参数。

于 2010-03-20T13:17:13.150 回答
1

解决方案使用lambda并且functools.partial非常正确并直接回答您的问题,但我认为它们并不是真正理想的解决方案。

filter// itertools.ifilter/mapitertools.imap匿名函数一起使用几乎总是比使用生成器表达式或列表推导式更清晰。例如,在这种情况下,我将编写生成器表达式

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

而不是使用ifilter. 在这种情况下,ifilter解决方案仍然具有相当的可读性,但在许多情况下,试图通过大量麻烦来定义正确的函数并不像仅仅执行操作那样值得。

于 2010-03-20T15:34:15.910 回答
-1

如果您使用ifilterthen 参数将需要是常量,在这种情况下您可以使用默认参数parameter=something。如果您希望参数发生变化,则需要使用另一种方法来获取二元谓词。

如果您手头已经有了列表,ifilter那么相对于内置过滤器来说有点过分了。

描述您想要完成的任务将有助于做出更具体的答案。

于 2010-03-20T13:20:15.717 回答