[EMAIL PROTECTED] wrote: > The following works perfectly: > import operator > def andmap(b,L): > return reduce(operator.and_, [b(x) for x in L]) > def ormap(b,L): > return reduce(operator.or_, [b(x) for x in L])
Note your [b(x) for x in L] evaluates b(x) for all elements of L before you begin the analysis. In 2.3 and beyond, you could define: def imap(function, source): for element in source: yield function(element) And apply any or all (as defined below) to imap(b, L) Although, you often needn't use bool(expr) in Python, more things are reasonable to use directly as tests; if implicitly converts to bool. So, for those cases, you could simply use any(L) or all(L). If you wish to use any and all (coming in 2.5), you could go with: def any(iterable): '''True iff at least one element of the iterable is True''' for element in iterable: if element: return True # or element and change the definition return False def all(iterable): '''True iff no element of the iterable is True''' for element in iterable: if not element: return False return True These will short-circuit in 2.3 and up (where iterators live). In 2.4 and up, generator expressions can be used: any(x*7-4 > 100 for x in xrange(50)) Even in 2.3, any and all as defined above work with generators: def generates(limit): for i in xrange(limit): yield i * 7 - 4 > 100 any(generates(800000000)) True any(generates(8)) False --Scott David Daniels [EMAIL PROTECTED] -- http://mail.python.org/mailman/listinfo/python-list