Newbi Q: Recursively reverse lists but NOT strings?

Dmitri O.Kondratiev dokondr at gmail.com
Mon Oct 15 05:38:32 EDT 2007


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:

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?

Thanks,

Dmitri O. Kondratiev
dokondr at gmail.com
http://www.geocities.com/dkondr

On 10/15/07, Gary Herron <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
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20071015/0d7594f6/attachment.html>


More information about the Python-list mailing list