【问题标题】:Python - functional "find"?Python - 功能“查找”?
【发布时间】:2010-03-03 14:20:25
【问题描述】:

我需要一个函数,它能够迭代集合,以集合元素作为参数调用提供的函数,并在从提供的函数接收到“True”时返回参数或其索引。

是这样的:

def find(f, seq, index_only=True, item_only=False):
     """Return first item in sequence where f(item) == True."""
     index = 0
     for item in seq:
         if f(item):
             if index_only:
                 return index
             if item_only:
                 return item
             return index, item
         index+= 1
     raise KeyError

所以我想知道标准 python 工具集中是否有类似的东西?

【问题讨论】:

  • OP 的 sn-p 是表达需求的更直接(如果只是更长一点)的方式;这可能是规定的方式,视情况而定。然而,从回复中得出了一个非常有用的见解:regarding loops, when in doubt, consult/consider itertools

标签: python functional-programming lambda


【解决方案1】:

试试itertools,例如ifilter

【讨论】:

    【解决方案2】:

    我认为没有任何具有如此精确语义的函数,无论如何你的函数很短,足够好,你可以很容易地改进它以供以后使用,所以使用它。

    因为简单胜于复杂。

    【讨论】:

      【解决方案3】:

      您可以使用itertools.dropwhile 跳过提供的函数返回False 的项目,然后取其余项目的第一项(如果有)。如果您需要索引而不是项目,请合并 itertools docs 的“食谱”部分中的 enumerate

      要反转提供的函数返回的真值,请使用lambdalambda x: not pred (x),其中pred 是提供的函数)或命名包装器:

      def negate(f):
          def wrapped(x):
              return not f(x)
          return wrapped
      

      例子:

      def odd(x): return x % 2 == 1
      itertools.dropwhile(negate(odd), [2,4,1]).next()
      # => 1
      

      如果没有找到匹配项,这将抛出StopIteration;将其包装在您自己的函数中,以抛出您选择的异常。

      【讨论】:

      • :(我认为OP的问题本身就是答案,对于简单的迭代来说,这可能更多。
      • 我同意 Anurag 的观点,但如果使用 itertools,我认为 ifilter 会更简单。例如:itertools.ifilter(odd, [2,4,1]).next()
      • 我倾向于同意ifilter。此外,OP 的 sn-p 确实很好地解决了基本问题;尽管如此,想知道标准库中有什么可以帮助避免为这样的东西编写代码似乎很合理。我想说 mjv 对这个问题的评论完美地总结了这里的重要教训。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-21
      • 2019-07-05
      • 2014-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多