Python - 函数式“查找”?
我需要一个函数,这个函数可以遍历一个集合,调用一个提供的函数,并把集合中的每个元素作为参数传给这个函数。如果这个提供的函数返回“真”(也就是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
我觉得没有什么函数能完全做到你想要的那种效果。不过你的函数写得很简短,也挺不错的,以后想改进也很简单,所以就用这个吧。
因为简单的东西总是比复杂的好。
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
;你可以把它放在你自己的函数里,这样就可以抛出你想要的异常。