Pre-PEP: reverse iteration methods
Andrew Dalke
adalke at mindspring.com
Wed Sep 24 15:51:56 EDT 2003
Stephen Horne:
> To me, the reason to use a method (or property) is simply that most
> types cannot be efficiently 'backwardised'.
Which is why my function looks for an '__riter__' under
the covers, so that an object can provide a specialized
implementation, if possible.
If it can't, I then proposed an implementation which will
iterate in reverse through lists and list-like interfaces (things
indexed by 0, 1, ... len(obj)-1). There is a problem though
in that my attempt at a 'generic' reverse implementation
will give strange errors in dictionary-like interfaces.
> For instance, iterators in
> general would have to be buffered into a list an then the resulting
> list iterated backwards. That could be useful, but the overhead is
> sufficient that I think explicitly writing 'list (x).backward ()'
> rather than 'x.backward ()' would be a good thing.
Those objects which implement a 'reverse_iterate' /
'backward' / whatever are identical to those which would
implement a __riter__ accessed under the covers.
My question is, what to do about objects which *don't*
provide a special method. Should there still be a standard
way to do a reverse iteration through them?
The only two I can think of are:
- assume
for i in range(len(obj)-1, -1, -1): yield obj[i]
works as a backup. It doesn't quite work because of
dictionaries.
- assume that storing all elements in a temporary
list and doing a reverse on the temp list is okay.
As you point out, it is the most generic but doesn't
work if memory is a problem. (There's also a
concern about proper destruction order if you want
to delete elements from a list starting from the end.)
- (There's a third, which is O(n**2). At every request,
iterate through the list to find the last element.)
If there is an acceptable solution (which needn't be
perfect, just practicable) then it's a good reason to
have it be a builtin over a special method.
I still point out that there are many other ways of
doing iteration and I don't see what makes reverse
iteration so important to get its own method.
Andrew
dalke at dalkescientific.com
More information about the Python-list
mailing list