是否有Python内置函数相当于std::find_if
,用于查找列表中第一个满足给定条件为true
的元素?换句话说,类似于列表的index()
函数,但是使用任意一元谓词而不仅仅是相等的测试。
我不想使用列表理解,因为我心目中特定的谓词计算起来有点昂贵。
借鉴了相关问题的答案,并参考taras发布的回答,我得出了以下结果:
>>> lst=[1,2,10,3,5,3,4]
>>> next(n for n in lst if n%5==0)
10
稍微修改一下即可得到索引而不是值:>>> next(idx for idx,n in enumerate(lst) if n%5==0)
2
如果没有匹配,这将引发异常StopIteration。您可能希望使用一个处理异常并返回None
的函数:
None
的函数。def first_match(iterable, predicate):
try:
return next(idx for idx,n in enumerate(iterable) if predicate(n))
except StopIteration:
return None
lst=[1,2,10,3,5,3,4]
print(first_match(lst, lambda x: x%5 == 0))
请注意,这里使用的是生成器表达式而不是列表推导式。列表推导式会将条件应用到列表的每个成员并生成所有匹配项的列表。相比之下,该方法将其应用于每个成员,直到找到匹配项然后停止,这是解决问题的最小工作量。
itertools.dropwhile(lambda x: not pred(x), lst).next()
pred(x)
为 False
并且 .next()
返回的值是满足 pred(x)
为 True
的值。
编辑:
一个示例用法是找到第一个可以被 5
整除的元素在 lst
中。>>> import itertools
>>> lst = [1,2,10,3,5,3,4]
>>> pred = lambda x: x % 5 == 0
>>> itertools.dropwhile(lambda x: not pred(x), lst).next()
10
next(n for n in lst if n%5==0)
完成这个任务。 - Fred Larson
any()
表达式的‘证人’”。 - jonrsharpe