Python - 函数式“查找”?

8 投票
3 回答
1324 浏览
提问于 2025-04-15 19:57

我需要一个函数,这个函数可以遍历一个集合,调用一个提供的函数,并把集合中的每个元素作为参数传给这个函数。如果这个提供的函数返回“真”(也就是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工具包里有没有类似的东西呢?

3 个回答

4

我觉得没有什么函数能完全做到你想要的那种效果。不过你的函数写得很简短,也挺不错的,以后想改进也很简单,所以就用这个吧。

因为简单的东西总是比复杂的好。

4

试试itertools这个库,比如里面的ifilter功能。

2

你可以使用 itertools.dropwhile 来跳过那些你提供的函数返回 False 的项目,然后从剩下的项目中取第一个(如果有的话)。如果你需要的是索引而不是项目本身,可以结合使用 enumerate,这个在 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;你可以把它放在你自己的函数里,这样就可以抛出你想要的异常。

撰写回答