Newbi Q: Recursively reverse lists but NOT strings?

Gary Herron gherron at islandtraining.com
Mon Oct 15 10:55:49 EDT 2007


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?
>
> 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
>
>
>
>




More information about the Python-list mailing list