是否存在等效于std::find_if
的内置python来查找给定条件为true
的列表的第一个元素?换句话说,类似于列表的index()
函数,但是具有任意一元谓词,而不仅仅是对相等性的检验。
我不想使用列表推导,因为我想到的特定谓词计算起来有些昂贵。
答案 0 :(得分:5)
使用an answer to a related question中的提示,并从发布的答案中借用,我想到了这一点:
>>> 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
:
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))
请注意,这使用生成器表达式,而不是列表推导。列表理解会将条件应用于列表的每个成员,并生成所有匹配项的列表。这会将其应用于每个成员,直到找到一个匹配项然后停止,这是解决问题的最低工作。
答案 1 :(得分:1)
说,您有一些谓词函数lst
和一个列表itertools.dropwhile
。
您可以使用lst
获取pred
中的第一个元素,
True
返回itertools.dropwhile(lambda x: not pred(x), lst).next()
的
pred(x)
它将跳过False
为.next()
和True
的所有元素
为您提供pred(x)为lst
的值。
编辑:
用于查找5
中被>>> 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
整除的第一个元素的示例
require