short-circuiting any/all ?

Tim Golden mail at timgolden.me.uk
Mon Mar 22 10:57:38 EDT 2010


On 22/03/2010 14:45, kj 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.)

Have I missed the point of your question, perhaps? This seems
to work as lazily as you'd like...

<code>
def less_than_five (x):
   print "testing", x
   return x < 5

L = range (10)
print any (less_than_five (i) for i in L)
print all (less_than_five (i) for i in L) # for symmetry

</code>

TJG



More information about the Python-list mailing list