Newbi Q: Recursively reverse lists but NOT strings?

Kurt Smith kwmsmith at gmail.com
Mon Oct 15 20:49:28 CEST 2007


On 10/15/07, Gary Herron <gherron at islandtraining.com> wrote:
> Dmitri O.Kondratiev wrote:
> > Gary, thanks for lots of info!
> > Python strings are not lists! I got it now. That's a pity, I need two
> > different functions: one to reverse a list and one to reverse a string:
> True, they are not both lists, but they *are* both sequences, with some
> things in common.  In particular xs[::-1] will reverse both types of
> objects.  And even if you roll you own reversal function, you don't need
> two.  One will do.
>
> Gary Herron
>
> >
> > def reverseList(xs):
> >     if xs == []:
> >         return xs
> >     else:
> >         return (reverseList (xs[1:])) + [xs[0]]
> >
> > def reverseStr(str):
> >     if str == "":
> >         return str
> >     else:
> >         return (reverseStr (str[1:])) + str[0]
> >
> > Ok. Now regarding in-place reversal of a list:
> >
> > >>> l = [1,2,3]
> > >>> l
> > [1, 2, 3]
> > >>> l.reverse()
> > >>> l
> > [3, 2, 1]
> >
> > That was, as I expected. Good.
> >
> > Then why this ? :
> >
> > >>> ls = [1,2,3].reverse()
> > >>> ls
> > >>>
> > >>> print [1,2,3].reverse()
> > None
> > >>>
> > I mean, why ls is empty after assignment?
> >
> > Also, I couldn't find in the Python docs what this form of slicing means:
> > xs[::-1]  ?
> >
> > It works for creating a reversed copy of either a string or a list,
> > but what does '::-1' syntax means?

mylist[::-1] is interpreted as mylist[slice(None,None,-1)], and the
slice object has a method, 'indices' that computes the right endpoints
for what you want to do.

So:

>>> myseq = (1,2,3)
>>> myseq[::-1]
(3, 2, 1)
>>> myseq[slice(None,None,-1)]
(3, 2, 1)
>>> myseq[None:None:-1]
(3, 2, 1)

etc.



> >
> > Thanks,
> >
> > Dmitri O. Kondratiev
> > dokondr at gmail.com <mailto:dokondr at gmail.com>
> > http://www.geocities.com/dkondr
> >
> > On 10/15/07, *Gary Herron* < gherron at islandtraining.com
> > <mailto:gherron at islandtraining.com>> wrote:
> >
> >     Dmitri O.Kondratiev wrote:
> >     >
> >     > The function I wrote (below) reverses lists all right:
> >     >
> >     > def reverse(xs):
> >     >     if xs == []:
> >     >         return []
> >     >     else:
> >     >         return (reverse (xs[1:])) + [xs[0]]
> >     >
> >     >
> >     > >>> reverse ([1,2,3])
> >     > [3, 2, 1]
> >     > >>>
> >     >
> >     >
> >     > Yet when I try to reverse a string I  get:
> >     >
> >     > >>> reverse ("abc")
> >     >
> >     > ...
> >     > ...
> >     > ...
> >     >
> >     >   File "C:\wks\python-wks\reverse.py", line 5, in reverse
> >     >
> >     >     return (reverse (xs[1:])) + [xs[0]]
> >     >
> >     >   File "C:\wks\python-wks\reverse.py", line 5, in reverse
> >     >
> >     >     return (reverse (xs[1:])) + [xs[0]]
> >     >
> >     >   File "C:\wks\python-wks\reverse.py", line 2, in reverse
> >     >
> >     >     if xs == []:
> >     >
> >     > RuntimeError: maximum recursion depth exceeded in cmp
> >     >
> >     > >>>
> >     >
> >     > What's wrong? Why recursion never stops?
> >     >
> >     If you are doing this as an python-learning exercise, then read
> >     on.   If
> >     you are doing this reversal for real code, then try:
> >
> >       xs.reverse() for in-place reversal of a list (but not a string), or
> >       result = xs[::-1] for creating a reversed copy of either a
> >     string or a
> >     list
> >
> >
> >     Your recursion stops when xs == [], but when you're stripping
> >     characters
> >     off a string,  like 'abc', the remaining portion will be 'bc',
> >     then 'c',
> >     than '', but never [] so you 'll never stop.
> >
> >     Try:
> >
> >     if xs == []:
> >         return []
> >     elif xs == '':
> >         return ''
> >     else:
> >         ...
> >
> >
> >     Gary Herron
> >
> >
> >     >
> >     > Thanks,
> >     > Dima
> >
> >
> >
> >
>
> --
> http://mail.python.org/mailman/listinfo/python-list
>



More information about the Python-list mailing list