Raymond Hettinger
3/22/2010 6:28:00 PM
On Mar 22, 7:45 am, kj <no.em...@please.post> wrote:
> I have a list of items L, and a test function is_invalid that checks
> the validity of each item. To check that there are no invalid
> items in L, I could check the value of any(map(is_invalid, L)).
> But this approach is suboptimal in the sense that, no matter what
> L is, is_invalid will be executed for all elements of L, even though
> the value returned by any() is fully determined by the first True
> in its argument. In other words, all calls to is_invalid after
> the first one to return True are superfluous. Is there a
> short-circuiting counterpart to any(map(is_invalid, L)) that avoids
> these superfluous calls?
>
> OK, there's this one, of course:
>
> def _any_invalid(L):
> for i in L:
> if is_invalid(i):
> return True
> return False
>
> But is there anything built-in? (I imagine that a lazy version of
> map *may* do the trick, *if* any() will let it be lazy.)
Yes, that will work:
from itertools import imap # lazy version of map
any(imap(is_invalid, L) # short-circuits on first True
Yet another approach (slightly faster):
from itertools import ifilter
any(ifilter(is_invalid, L))
Raymond