Python等效于C ++ find_if

时间:2018-07-18 20:58:31

标签: python syntax

是否存在等效于std::find_if的内置python来查找给定条件为true的列表的第一个元素?换句话说,类似于列表的index()函数,但是具有任意一元谓词,而不仅仅是对相等性的检验。

我不想使用列表推导,因为我想到的特定谓词计算起来有些昂贵。

2 个答案:

答案 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