# andmap and ormap

Scott David Daniels scott.daniels at acm.org
Wed Mar 15 00:11:28 CET 2006

```wkehowski at cox.net 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
scott.daniels at acm.org

```

More information about the Python-list mailing list