Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python equivalent of c++ find_if

Tags:

python

syntax

Is there a built-in python equivalent of std::find_if to find the first element of a list for which a given condition is true? In other words, something like the index() function of a list, but with an arbitrary unary predicate rather than just a test for equality.

I don't want to use list comprehension, because the specific predicate I have in mind is somewhat expensive to compute.

like image 566
Mike Hawk Avatar asked Jan 02 '23 03:01

Mike Hawk


1 Answers

Using a tip from an answer to a related question, and borrowing from the answer taras posted, I came up with this:

>>> lst=[1,2,10,3,5,3,4]
>>> next(n for n in lst if n%5==0)
10

A slight modification will give you the index rather than the value:

>>> next(idx for idx,n in enumerate(lst) if n%5==0)
2

Now, if there was no match this will raise an exception StopIteration. You might want use a function that handles the exception and returns None if there was no match:

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))

Note that this uses a generator expression, not a list comprehension. A list comprehension would apply the condition to every member of the list and produce a list of all matches. This applies it to each member until it finds a match and then stops, which is the minimum work to solve the problem.

like image 74
Fred Larson Avatar answered Jan 05 '23 18:01

Fred Larson