By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
428,853 Members | 2,186 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 428,853 IT Pros & Developers. It's quick & easy.

Find the first element that meets the condition

P: n/a
Hi,
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

-
Suresh

Feb 25 '07 #1
Share this Question
Share on Google+
3 Replies


P: n/a
I have implemented it this way, may be, there should be a built in
hiding somewhere in the standard libraries?
the itertools module might have what you're after. something similar
to your example:
>>import itertools
r = iter(range(100))
n = itertools.dropwhile(lambda x:x<=13, r)
n.next()
14
Feb 25 '07 #2

P: n/a
jm*******@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

Feb 25 '07 #3

P: n/a
"jm*******@no.spam.gmail.com" <jm*******@gmail.comwrites:
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):
To check for existence, use any(condition, iterable). If you actually
want the first element, use itertools.ifilter(condition, iterable).next().
The suggestion of using dropwhile isn't so great because it actually
consumes the first match, so you have to write your condition to
stop immediately before the element you want, not always easy.
Feb 25 '07 #4

This discussion thread is closed

Replies have been disabled for this discussion.