Python等价的c++find_i

2024-10-01 02:17:58 发布

您现在位置:Python中文网/ 问答频道 /正文

是否有一个内置的python等价物std::find_if来查找给定条件为true的列表的第一个元素?换句话说,类似于list的index()函数,但是有一个任意的一元谓词,而不仅仅是一个等式测试。在

我不想使用列表理解,因为我心目中的特定谓词计算起来有点昂贵。在


Tags: 函数true元素列表indexiffind条件
2条回答

例如,您有一些谓词函数pred和一个列表lst。 您可以使用itertools.dropwhile来获取lst中的第一个元素, 其中pred返回{},其中

itertools.dropwhile(lambda x: not pred(x), lst).next()

它跳过pred(x)False和{}的所有元素 生成pred(x)为True的值。在

编辑:

用于查找lst中可被5整除的第一个元素的示例

^{pr2}$

利用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

稍微修改一下,您将得到索引而不是值:

^{pr2}$

现在,如果没有匹配项,这将引发一个异常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))

请注意,这使用的是生成器表达式,而不是列表理解。列表理解将把条件应用到列表的每个成员,并生成一个包含所有匹配项的列表。这会将其应用于每个成员,直到找到匹配项,然后停止,这是解决问题的最小工作量。在

相关问题 更多 >