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

2 投票
4 回答
2286 浏览
提问于 2025-04-15 20:38

在Python中,我有一个这样的函数:

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

现在我想用这个函数来过滤一个列表,并且给它一个固定的参数。Python有一个叫做itertools.ifilter的函数,但我不知道怎么传递这个参数。这样做可能吗?如果不行,我该怎么解决这个问题呢?

4 个回答

1

这些解决方案使用了 lambdafunctools.partial,确实是正确的,直接回答了你的问题,但我觉得它们并不是最理想的解决办法。

使用 filteritertools.ifiltermapitertools.imap 结合匿名函数,通常会比使用生成器表达式或列表推导式要不那么清晰。比如,在这种情况下,我会写出生成器表达式

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

而不是使用 ifilter。在这个例子中,ifilter 的解决方案还是比较容易理解的,但在很多情况下,费劲去定义一个恰到好处的函数,可能没有直接进行操作来得更划算。

5

我更喜欢 functools.partial,而不是 lambda

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

把它放在一个 lambda 里:

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

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

撰写回答