代码之家  ›  专栏  ›  技术社区  ›  Peter Smit

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

  •  1
  • Peter Smit  · 技术社区  · 14 年前

    在python中,我有以下函数:

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

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

    4 回复  |  直到 14 年前
        1
  •  3
  •   Eli Bendersky    14 年前

    lambda :

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

        2
  •  5
  •   Jochen Ritzel    14 年前

    我喜欢 functools.partial 比…好多了 lambda

    itertools.ifilter( partial(is_a_nice_element, parameter=X), iterable )
    
        3
  •  1
  •   Mike Graham    14 年前

    解决方案使用 lambda functools.partial 你的答案很正确,很直接,但我认为它们不是理想的解决方案。

    使用 filter itertools.ifilter / map / itertools.imap 使用匿名函数总是比使用生成器表达式或列表理解更难理解。例如,在本例中,我将编写生成器表达式

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

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

        4
  •  -1
  •   msw    14 年前

    ifilter 然后参数必须是常量,在这种情况下可以使用默认参数 parameter=something

    如果你已经拿到名单了, I过滤器 相对于内置的 filter

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