Python - 函数式“查找”?

发布于 2024-08-24 10:22:43 字数 504 浏览 5 评论 0原文

我需要一个函数,它能够迭代集合,以集合的元素作为参数调用提供的函数,并在从提供的函数接收到“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工具集中是否有类似的东西?

I need a function, which is capable of iterating over the collection, calling a supplied function with element of the collection as a parameter and returning the parameter or it's index when received "True" from supplied function.

It is somethong like this:

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

So I am wondering whether there's anything like that in standart python toolset?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

梦幻的味道 2024-08-31 10:22:43

尝试 itertools ,例如 ifilter

Try itertools and for example ifilter.

不打扰别人 2024-08-31 10:22:43

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

因为简单总比复杂好。

I don't think there is any such function with such exact semantics, and anyway your function is short , good enough and you can easily improve it for later use, so use it.

because simple is better than complex.

坏尐絯 2024-08-31 10:22:43

您可以使用 itertools.dropwhile 跳过所提供的函数返回 False 的项目,然后获取其余项目中的第一项(如果有)。如果您需要索引而不是项目,请合并 itertools 文档

要反转提供的函数返回的真值,请使用 lambda (lambda 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 ;将其包装在您自己的函数中以抛出您选择的异常。

You can use itertools.dropwhile to skip over the items for which the supplied function returns False, then take the first item of the rest (if any). If you need the index rather than the item, incorporate enumerate from the Recipes section of itertools docs.

To reverse truth values returned by the supplied function, use a lambda (lambda x: not pred (x), where pred is the supplied function) or a named wrapper:

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

Example:

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

This will throw StopIteration if no matching item is found; wrap it in a function of your own to throw an exception of your choice instead.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文