2010-03-20 63 views
1

在Python中,我有以下功能:如何为Python itertools.ifilter函数提供额外的参数?

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

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

回答

3

把它包在一个lambda

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

42是你的额外的参数,或者其他任何你希望它是。

+0

谢谢,这是我真正需要的! – 2010-03-20 13:39:10

-1

如果您使用的是ifilter,则参数需要保持不变,在这种情况下,您可以使用默认参数parameter=something。如果你想让参数变化,你需要使用另一种方法来进行二元谓词。

如果您已经拥有清单,ifilter相对于内置的filter有点矫枉过正。

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

+0

对不起,但我需要在这里给出这个参数。如果我不需要参数,那么我不会有问题。 – 2010-03-20 13:40:55

3

我喜欢functools.partiallambda好得多。

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

+1使用'偏',虽然你没有解释为什么你更喜欢它。 – amotzg 2013-10-21 11:50:04

1

该解决方案使用lambdafunctools.partial是十分正确的,直接回答你的问题,但我不认为他们是真正理想的解决方案。

使用filter/itertools.ifilter/map/itertools.imap与匿名功能prettymuch总是会比使用生成的表达或列表理解不太清楚。例如,在这种情况下,我会写发电机表达

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

代替使用ifilter。在这种情况下,ifilter解决方案仍然具有相当的可读性,但在许多情况下,尝试经历许多麻烦来定义正确的功能并不像仅仅执行操作一样有价值。

+0

这样做的一个缺点是您无法参数化过滤器。 EG,如果你想在像'def find_nice_elements(filter_function = partial(is_nice,p = 42))这样的函数内做这个过滤:...' – intuited 2010-06-21 03:04:41

相关问题