Find the first element that meets the condition

Peter Otten __peter__ at web.de
Sun Feb 25 05:41:36 EST 2007


jm.suresh at no.spam.gmail.com wrote:

> I have a list and I want to find the first element that meets a
> condition. I do not want to use 'filter', because I want to come out
> of the iteration as soon as the first element is found.
> I have implemented it this way, may be, there should be a built in
> hiding somewhere in the standard libraries?
> 
> def exists(iterable, condition):
>     '''
>     Return the first element in iterble that meets the condition.
>     '''
>     for x in iterable:
>         if condition(x):
>             return x
>     raise Exception('No element meets the given condition.')
> 
> 
> 
>>>> exists(xrange(1000), lambda x: x>13)
> 14

If you are only interested in existence you can use any() (new in Python2.5)

>>> any(x>13 for x in xrange(1000))
True

Otherwise there is itertools.ifilter() a lazy variant of the filter()
builtin:

>>> import itertools
>>> items = iter(xrange(1000)) # just to prove...
>>> itertools.ifilter(lambda x: x > 13, items).next()
14
>>> items.next() # that ifilter has consumed only the first 15 items
15

You may want to wrap the ifilter() call to get a more sensible exception,
say ValueError instead of StopIteration:

# untested
def findfirst(items, predicate=bool):
    for item in itertools.ifilter(predicate, items):
        return item
    raise ValueError("No matching element")

Peter




More information about the Python-list mailing list