[Tutor] map() practice
Peter Otten
__peter__ at web.de
Sun Oct 21 10:42:40 CEST 2012
Malcolm Newsome wrote:
> Hello all,
>
> I looked at map() tonight. I think I have a decent understanding now of
> "how" it works. However, I'm wondering when it is most commonly used in
> the real world and if you could provide some examples (I like to do a
> lot of web stuff...it that helps with regards to providing a context for
> real world application).
map() is convenient whenever you need to apply an existing function to all items of a list:
A very simple date parser using map()
>>> year, month, date = map(int, "2012-10-21".split("-"))
>>> year, month, date
(2012, 10, 21)
or a list comprehension:
>>> [int(x) for x in "2012-10-21".split("-")]
[2012, 10, 21]
Calculating a sum of absolute values using map()
>>> sum(map(abs, range(-10, 10)))
100
or a generator expression:
>>> sum(abs(x) for x in range(-10, 10))
100
Calculating the dot product of two vectors using map()
>>> x = range(10)
>>> y = range(0, 100, 10)
>>> from operator import mul
>>> sum(map(mul, x, y))
2850
or zip() and a generator expression:
>>> sum(a*b for a, b in zip(x, y))
2850
If you want real-world applications I encourage you to use grep
on the code base that interests you, e. g.:
$ grep '[^a-zA-Z]map(' /usr/lib/python2.7/*.py | head
/usr/lib/python2.7/argparse.py: tup = value, ', '.join(map(repr, action.choices))
/usr/lib/python2.7/ast.py: return tuple(map(_convert, node.elts))
/usr/lib/python2.7/ast.py: return list(map(_convert, node.elts))
/usr/lib/python2.7/Bastion.py: print "b._get_.func_defaults =", map(type, b._get_.func_defaults),
/usr/lib/python2.7/CGIHTTPServer.py: nobody = 1 + max(map(lambda x: x[2], pwd.getpwall()))
/usr/lib/python2.7/cgi.py: return map(attrgetter('value'), value)
/usr/lib/python2.7/cgi.py: return map(attrgetter('value'), value)
/usr/lib/python2.7/cmd.py: ", ".join(map(str, nonstrings)))
/usr/lib/python2.7/codecs.py:def make_encoding_map(decoding_map):
/usr/lib/python2.7/code.py: map(self.write, list)
Note that it is bad style to use map() for its side effects like in the last
match. It does extra work to create a list that consumes memory only to be
thrown away immediatly afterwards:
>>> import sys
>>> lines = ["alpha\n", "beta\n", "gamma\n"]
>>> map(sys.stdout.write, lines) # DON'T DO THIS
alpha
beta
gamma
[None, None, None]
# BETTER
>>> for line in lines:
... sys.stdout.write(line)
...
alpha
beta
gamma
# EVEN BETTER (in this particular case)
>>> sys.stdout.writelines(lines)
alpha
beta
gamma
PS: In Python 3 map() has become "lazy", i. e. it works like a
generator expression rather than a list comprehension. For some applications
you have to replace map(...) with list(map(...)) to make the code work in
Python 3.
More information about the Tutor
mailing list