What's the difference between these 2 statements?

Discussion in 'Python' started by ATSkyWalker, Apr 20, 2005.

  1. ATSkyWalker

    ATSkyWalker Guest

    What's the difference between these 2 statements?

    If you have a String s="12345"

    s[len(s)::-1] = "54321"

    But

    s[len(s):0:-1] = "5432"

    Why? What's the difference? What number then can I use as the end of
    the slice if I were to supply all 3 parameters?


    Thanks,
    AT
     
    ATSkyWalker, Apr 20, 2005
    #1
    1. Advertising

  2. ATSkyWalker wrote:
    > What's the difference between these 2 statements?
    >
    > If you have a String s="12345"
    >
    > s[len(s)::-1] = "54321"
    >
    > But
    >
    > s[len(s):0:-1] = "5432"
    >
    > Why? What's the difference? What number then can I use as the end of
    > the slice if I were to supply all 3 parameters?


    -1.

    Reinhold
     
    Reinhold Birkenfeld, Apr 20, 2005
    #2
    1. Advertising

  3. ATSkyWalker

    tiissa Guest

    Reinhold Birkenfeld wrote:
    > ATSkyWalker wrote:
    >
    >>What's the difference between these 2 statements?
    >>
    >>If you have a String s="12345"
    >>
    >>s[len(s)::-1] = "54321"
    >>
    >>But
    >>
    >>s[len(s):0:-1] = "5432"
    >>
    >>Why? What's the difference? What number then can I use as the end of
    >>the slice if I were to supply all 3 parameters?

    >
    >
    > -1.


    -len(s) or less.
    -1 will return an empty string.

    Actually you start from len(s)-1 (len(s) is not an index in s) and you
    stop when you reach the index specified (or the end). Since -1 is the
    same index as the starting one (-1~>len(s)-1, -2~>len(s)-2,
    -len(s)+1~>0), you end up with an empty string.

    Therefore you have to try to reach indices lower (due to the negative
    step) than the minimum valid index of your list in order to reverse it
    fully.
     
    tiissa, Apr 20, 2005
    #3
  4. ATSkyWalker

    Guest

    s[len(s):-1:-1] yields an empty list !

    Test code :

    s = "12345"
    print s[len(s)::-1] -> prints "54321"
    print s[len(s):-1:-1] -> prints "" (nothing)
     
    , Apr 20, 2005
    #4
  5. tiissa wrote:
    > Reinhold Birkenfeld wrote:
    >> ATSkyWalker wrote:
    >>
    >>>What's the difference between these 2 statements?
    >>>
    >>>If you have a String s="12345"
    >>>
    >>>s[len(s)::-1] = "54321"
    >>>
    >>>But
    >>>
    >>>s[len(s):0:-1] = "5432"
    >>>
    >>>Why? What's the difference? What number then can I use as the end of
    >>>the slice if I were to supply all 3 parameters?

    >>
    >>
    >> -1.

    >
    > -len(s) or less.
    > -1 will return an empty string.
    >
    > Actually you start from len(s)-1 (len(s) is not an index in s) and you
    > stop when you reach the index specified (or the end). Since -1 is the
    > same index as the starting one (-1~>len(s)-1, -2~>len(s)-2,
    > -len(s)+1~>0), you end up with an empty string.
    >
    > Therefore you have to try to reach indices lower (due to the negative
    > step) than the minimum valid index of your list in order to reverse it
    > fully.


    Right, sorry.

    Well, I guess that's why one can leave out the index...

    Reinhold
     
    Reinhold Birkenfeld, Apr 20, 2005
    #5
  6. ATSkyWalker

    Guest

    I'm sorry, I'm not really following your logic. Can you supply the
    statement with the three parameters ?

    so if I want to reverse it fully using s[len(s)-1:x:-1] what would x be
    or is it impossible to express it in this way ?

    Thanks,
    AT
     
    , Apr 20, 2005
    #6
  7. ATSkyWalker

    Peter Otten Guest

    wrote:

    > so if I want to reverse it fully using s[len(s)-1:x:-1] what would x be
    > or is it impossible to express it in this way ?


    This does not work for integers, because the theoretically correct value
    x = -1 already has another interpretation as the gap between the last and
    the last but one character. Here are two workarounds:

    1. Set x to None

    >>> s = "12345"
    >>> s[len(s):None:-1]

    '54321'

    2. Separate slicing operation and reversal:

    >>> s = "12345"
    >>> s[0:len(s)][::-1]

    '54321'

    Peter
     
    Peter Otten, Apr 20, 2005
    #7
  8. ATSkyWalker

    ATSkyWalker Guest

    Peter,

    I like the way you put it "the gap between the last and
    the last but one character" :).

    I guess this is a side effect of of python's asymetric slice indexing
    approach which takes a little getting used to.

    AT
     
    ATSkyWalker, Apr 20, 2005
    #8
  9. ATSkyWalker

    tiissa Guest

    wrote:
    > I'm sorry, I'm not really following your logic. Can you supply the
    > statement with the three parameters ?
    >
    > so if I want to reverse it fully using s[len(s)-1:x:-1] what would x be
    > or is it impossible to express it in this way ?


    Contrary to what I said above x should be _strictly_ less than -len(s).
    You stop when you reach in the list the given end index (and don't take
    the item there) or if you leave the index range.

    But -1 as an index is the same as (len(s)-1).
    Therefore going from len(s)-1 down to -1 is the same as going from
    len(s)-1 to len(s)-1 hence an empty list.

    And -len(s) is the same as 0 (my mistake above)
    But -len(s)-1 is not in the list thus you won't discard any limit.

    The example:
    In [1]: s='12345'

    In [2]: s[len(s)-1:0:-1]
    Out[2]: '5432'

    In [3]: s[len(s)-1:-1:-1]
    Out[3]: ''

    In [4]: s[-1],s[len(s)-1]
    Out[4]: ('5', '5')

    In [5]: s[len(s)-1:-len(s)-1:-1]
    Out[5]: '54321'

    In [6]: s[len(s)-1:-len(s):-1]
    Out[6]: '5432'
     
    tiissa, Apr 20, 2005
    #9
  10. ATSkyWalker

    tiissa Guest

    Peter Otten wrote:
    > wrote:
    >
    >
    >>so if I want to reverse it fully using s[len(s)-1:x:-1] what would x be
    >>or is it impossible to express it in this way ?

    >
    >
    > This does not work for integers, because the theoretically correct value
    > x = -1 already has another interpretation as the gap between the last and
    > the last but one character.

    AFAIK, it is not an issue of integer (what else can an slice index be in
    python?) but simply of index aliasing.

    For x=-len(s)-1, you get the whole reversed list:

    In [5]: s[len(s)-1:-len(s)-1:-1]
    Out[5]: '54321'
     
    tiissa, Apr 20, 2005
    #10
  11. ATSkyWalker

    Peter Otten Guest

    tiissa wrote:

    > Peter Otten wrote:
    >> wrote:
    >>
    >>
    >>>so if I want to reverse it fully using s[len(s)-1:x:-1] what would x be
    >>>or is it impossible to express it in this way ?

    >>
    >>
    >> This does not work for integers, because the theoretically correct value
    >> x = -1 already has another interpretation as the gap between the last and
    >> the last but one character.

    > AFAIK, it is not an issue of integer (what else can an slice index be in
    > python?) but simply of index aliasing.
    >
    > For x=-len(s)-1, you get the whole reversed list:
    >
    > In [5]: s[len(s)-1:-len(s)-1:-1]
    > Out[5]: '54321'


    Clever. I didn't think of that.
    Still, for practical purposes you have to test for slicelen >= stringlen, so
    whether you choose None, -len(s)-1, or -sys.maxint as the second slice
    parameter doesn't matter much.

    Peter
     
    Peter Otten, Apr 20, 2005
    #11
  12. ATSkyWalker

    tiissa Guest

    Peter Otten wrote:
    > Still, for practical purposes you have to test for slicelen >= stringlen, so
    > whether you choose None, -len(s)-1, or -sys.maxint as the second slice
    > parameter doesn't matter much.


    Sure, for practical purposes you don't bother to write extra characters
    and leave it void.
    But we knew it from the start of the thread. ;)
     
    tiissa, Apr 20, 2005
    #12
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. jakk
    Replies:
    4
    Views:
    12,395
  2. Rach
    Replies:
    2
    Views:
    441
    Andy Fish
    Jun 9, 2004
  3. Guybrush Threepwood
    Replies:
    7
    Views:
    522
    Nick Hounsome
    Feb 26, 2004
  4. JohnJSal
    Replies:
    13
    Views:
    442
    John Salerno
    Nov 4, 2006
  5. arnuld
    Replies:
    33
    Views:
    1,202
Loading...

Share This Page