Why zip when you can map?
You’ve got a couple of parallel lists you’d like to combine and output, a line for each pair. Here’s one way to do it: use zip
to do the combining.
>>> times = [42.12, 42.28, 42.34, 42.40, 42.45] >>> names = ['Hickman', 'Guest', 'Burns', 'Williams'] >>> fmt = '{:20} {:.2f}'.format >>> print('\n'.join(fmt(n, t) for n, t in zip(names, times))) Hickman 42.12 Guest 42.28 Burns 42.34 Williams 42.40
Slightly more succinctly:
>>> print('\n'.join(fmt(*nt) for nt in zip(names, times))) ...
If you look at the generator expression passed into str.join
, you can see we’re just mapping fmt
to the zipped names
and times
lists.
Well, sort of.
>>> print('\n'.join(map(fmt, zip(names, times)))) Traceback (most recent call last): ... IndexError: tuple index out of range
To fix this, we could use itertools.starmap
which effectively unpacks the zipped pairs.
>>> from itertools import starmap >>> print('\n'.join(starmap(fmt, zip(names, times)))) Hickman 42.12 Guest 42.28 Burns 42.34 Williams 42.40
This latest version looks clean enough but there’s something odd about zipping two lists together only to unpack the resulting 2-tuples for consumption by the format function.
Don’t forget, map
happily accepts more than one sequence! There’s no need to zip
after all.
Don’t zip, map!
>>> print('\n'.join(map(fmt, names, times))) ...