Real-world use cases for map's None fill-in feature?
Raymond Hettinger
python at rcn.com
Tue Jan 10 05:51:29 EST 2006
[Raymond]
> > Both approaches require a certain measure of inventiveness, rely on
> > advanced tricks, and forgo readability to gain the raw speed and
> > conciseness afforded by a clever use of itertools. They are also a
> > challenge to review, test, modify, read, or explain to others.
[Peter Otten]
> Is this the author of itertools becoming its most articulate opponent? What
> use is this collection of small functions sharing an underlying concept if
> you are not supposed to combine them to your heart's content? You probably
> cannot pull off some of those tricks until you have good working knowledge
> of the iterator protocol, but that is becoming increasingly important to
> understand all Python code.
I'm happy with the module -- it has been well received and is in
widespread use. The components were designed to be useful both
individually and in combination.
OTOH, I sometimes cringe at code reminiscent of APL:
it = chain(iterable, repeat('', group_size-1))
result = izip(*[it]*group_size)
The code is understandable IF you're conversant with all the component
idioms; however, if you're the slightest bit rusty, the meaning of the
code is not obvious. Too much of the looping logic is implicit (1D
padded input reshaped and truncated to a 2D iterator of tuples); the
style is not purely functional (relying on side-effects from multiple
calls to the same iterator); there are two distinct meanings for the
star operator; and it is unlikely that a most people remember the
precedence rules for whether *[it] expands before the [it]*group_size
repeats. All in all, it cannot be claimed to be a masterpiece of
clarity. That being said, if speed was essential, I would use it every
time (as a separate helper function and never as in-line code).
Of course, the main point of the post was that Duncan's use case was
readily solved with existing tools and did not demonstrate a need for
izip_longest(). His original code was almost there -- it just needed
to use chain() instead of list concatenation.
> Regarding the thread's topic, I have no use cases for a map(None, ...)-like
> izip_longest(), but occasionally I would prefer izip() to throw a
> ValueError if its iterable arguments do not have the same "length".
The Standard ML authors agree. Their library offers both alternatives
(with and without an exception for unequal inputs):
http://www.standardml.org/Basis/list-pair.html#SIG:LIST_PAIR.zipEq:VAL
Thanks for the input,
Raymond
More information about the Python-list
mailing list