如何找到与Python中的谓词匹配的序列中的第一个元素?

mis*_*tor 3 python functional-programming python-3.x

可能重复:
Python:查找与谓词匹配的序列中的第一个元素

Python标准库中是否有更高阶的函数来封装以下控制流模式?

>>> def find(pred, coll):
...   for x in coll:
...     if pred(x):
...       return x
... 
>>> find(lambda n : n % 2 == 0, [3, 5, 8, 9, 6])
8
>>> find(lambda n : n % 2 == 0, [3, 5, 7, 9, 6])
6
>>> find(lambda n : n % 2 == 0, [3, 5, 7, 9, 1])
Run Code Online (Sandbox Code Playgroud)

Thi*_*ter 10

您可以组合ifilterislice获得第一个匹配元素.

>>> list(itertools.islice(itertools.ifilter(lambda n: n % 2 == 0, lst), 1))
[8]
Run Code Online (Sandbox Code Playgroud)

但是,我不会认为这比您发布的原始代码更具可读性或更好.包含在一个函数中它会更好.由于next只返回一个元素,因此不再需要islice:

def find(pred, iterable):
    return next(itertools.ifilter(pred, iterable), None)
Run Code Online (Sandbox Code Playgroud)

None如果未找到任何元素,则返回.

但是,每个循环仍然会调用谓词函数.请考虑使用列表推导或生成器表达式:

>>> next((x for x in lst if x % 2 == 0), None)
8
Run Code Online (Sandbox Code Playgroud)