Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What does extended slice syntax actually do for negative steps? [duplicate]

The extended slice syntax in python has been explained to me as "a[n:m:k] returns every kth element from n to m".

This gives me a good idea what to expect when k is positive. But I'm lost on how to interpret a[n:m:k] for negative k. I know that a[::-1] reverses a, and that a[::-k] takes ever kth element of the reversed a.

But how is this a generalization of the definition for k positive? I'd like to know how a[n:m:k] is actually defined, so that (for example) I can understand why:

"abcd"[-1:0:-1] = "dcb"

Is a[n:m:-k] reversing the sequence a, then taking the elements with original indices starting from n and ending one before m or something? I don't think so, because this pattern doesn't fit other values of n and m I've tried. But I'm at a loss to figure out how this is actually defined, and searching has gotten me nowhere.

like image 935
Alex Becker Avatar asked Jan 25 '13 07:01

Alex Becker


2 Answers

[-1:0:-1] means: start from the index len(string)-1 and move up to 0(not included) and take a step of -1(reverse).

So, the following indexes are fetched:

le-1, le-1-1, le-1-1-1  .... 1  # le is len(string) 

example:

In [24]: strs = 'foobar'  In [25]: le = len(strs)  In [26]: strs[-1:0:-1]  # the first -1 is equivalent to len(strs)-1  Out[26]: 'raboo'  In [27]: strs[le-1:0:-1]    Out[27]: 'raboo' 
like image 123
Ashwini Chaudhary Avatar answered Oct 12 '22 19:10

Ashwini Chaudhary


The Python documentation (here's the technical one; the explanation for range() is a bit easier to understand) is more correct than the simplified "every kth element" explanation. The slicing parameters are aptly named

slice[start:stop:step]

so the slice starts at the location defined by start, stops before the location stop is reached, and moves from one position to the next by step items.

like image 27
Tim Pietzcker Avatar answered Oct 12 '22 18:10

Tim Pietzcker