On 10/15/07, Gary Herron <[EMAIL PROTECTED]> 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 > > [EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]> > > http://www.geocities.com/dkondr > > > > On 10/15/07, *Gary Herron* < [EMAIL PROTECTED] > > <mailto:[EMAIL PROTECTED]>> 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 > -- http://mail.python.org/mailman/listinfo/python-list