It is easy to understand if we could relate slicing to range, which gives the indexes. We can categorize slicing into the following two categories:
1. No step or step > 0. For example, [i:j] or [i:j:k] (k>0)
Suppose the sequence is s=[1,2,3,4,5].
- if
0<i<len(s) and 0<j<len(s), then [i:j:k] -> range(i,j,k)
For example, [0:3:2] -> range(0,3,2) -> 0, 2
- if
i>len(s) or j>len(s), then i=len(s) or j=len(s)
For example, [0:100:2] -> range(0,len(s),2) -> range(0,5,2) -> 0, 2, 4
- if
i<0 or j<0, then i=max(0,len(s)+i) or j=max(0,len(s)+j)
For example, [0:-3:2] -> range(0,len(s)-3,2) -> range(0,2,2) -> 0
For another example, [0:-1:2] -> range(0,len(s)-1,2) -> range(0,4,2) -> 0, 2
- if
i is not specified, then i=0
For example, [:4:2] -> range(0,4,2) -> range(0,4,2) -> 0, 2
- if
j is not specified, then j=len(s)
For example, [0::2] -> range(0,len(s),2) -> range(0,5,2) -> 0, 2, 4
2. Step < 0. For example, [i:j:k] (k<0)
Suppose the sequence is s=[1,2,3,4,5].
- if
0<i<len(s) and 0<j<len(s), then [i:j:k] -> range(i,j,k)
For example, [5:0:-2] -> range(5,0,-2) -> 5, 3, 1
- if
i>len(s) or j>len(s), then i=len(s)-1 or j=len(s)-1
For example, [100:0:-2] -> range(len(s)-1,0,-2) -> range(4,0,-2) -> 4, 2
- if
i<0 or j<0, then i=max(-1,len(s)+i) or j=max(-1,len(s)+j)
For example, [-2:-10:-2] -> range(len(s)-2,-1,-2) -> range(3,-1,-2) -> 3, 1
- if
i is not specified, then i=len(s)-1
For example, [:0:-2] -> range(len(s)-1,0,-2) -> range(4,0,-2) -> 4, 2
- if
j is not specified, then j=-1
For example, [2::-2] -> range(2,-1,-2) -> 2, 0
For another example, [::-1] -> range(len(s)-1,-1,-1) -> range(4,-1,-1) -> 4, 3, 2, 1, 0
In summary
