如何为Python itertools.ifilter函数提供额外的参数?

时间:2010-03-20 13:09:58

标签: python ifilter itertools

在python中我有以下功能:

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

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

4 个答案:

答案 0 :(得分:4)

我比lambda更喜欢functools.partial

itertools.ifilter( partial(is_a_nice_element, parameter=X), iterable )

答案 1 :(得分:3)

将其包裹在lambda

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

42是你额外的论点,或者你想要的其他任何东西。

答案 2 :(得分:1)

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

filter / itertools.ifilter / map / itertools.imap与匿名函数一起使用,总是比使用生成器表达式或列表解析更不清楚。例如,在这种情况下,我会编写生成器表达式

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

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

答案 3 :(得分:-1)

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

如果您已经拥有列表,ifilter相对于内置filter而言有点过分。

描述你想要完成的事情将有助于做出更具体的答案。