Yes, calling s[0:-1] is exactly the same as calling s[:-1].
Using a negative number as an index in python returns the nth element from the right-hand side of the list (as opposed to the usual left-hand side).
so if you have a list as so:
myList = ['a', 'b', 'c', 'd', 'e']
print myList[-1] # prints 'e'
the print statement will print "e".
Once you understand that (which you may already, it's not entirely clear if that's one of the things you're confused about or not) we can start talking about slicing.
I'm going to assume you understand the basics of a slice along the lines of myList[2:4] (which will return ['c', 'd']) and jump straight into the slicing notation where one side is left blank.
As you suspected in your post, myList[:index] is exactly the same as myList[0:index].
This is also works the other way around, by the way... myList[index:] is the same as myList[index:len(myList)] and will return a list of all the elements from the list starting at index and going till the end (e.g. print myList[2:] will print ['c', 'd', 'e']).
As a third note, you can even do print myList[:] where no index is indicated, which will basically return a copy of the entire list (equivalent to myList[0:len(myList)], returns ['a', 'b', 'c', 'd', 'e']). This might be useful if you think myList is going to change at some point but you want to keep a copy of it in its current state.
If you're not already doing it I find just messing around in a Python interpreter a whole bunch a big help towards understanding these things. I recommend IPython.
Answer from Redwood on Stack OverflowYes, calling s[0:-1] is exactly the same as calling s[:-1].
Using a negative number as an index in python returns the nth element from the right-hand side of the list (as opposed to the usual left-hand side).
so if you have a list as so:
myList = ['a', 'b', 'c', 'd', 'e']
print myList[-1] # prints 'e'
the print statement will print "e".
Once you understand that (which you may already, it's not entirely clear if that's one of the things you're confused about or not) we can start talking about slicing.
I'm going to assume you understand the basics of a slice along the lines of myList[2:4] (which will return ['c', 'd']) and jump straight into the slicing notation where one side is left blank.
As you suspected in your post, myList[:index] is exactly the same as myList[0:index].
This is also works the other way around, by the way... myList[index:] is the same as myList[index:len(myList)] and will return a list of all the elements from the list starting at index and going till the end (e.g. print myList[2:] will print ['c', 'd', 'e']).
As a third note, you can even do print myList[:] where no index is indicated, which will basically return a copy of the entire list (equivalent to myList[0:len(myList)], returns ['a', 'b', 'c', 'd', 'e']). This might be useful if you think myList is going to change at some point but you want to keep a copy of it in its current state.
If you're not already doing it I find just messing around in a Python interpreter a whole bunch a big help towards understanding these things. I recommend IPython.
>>> l = ['abc', 'def', 'ghi', 'jkl', 'mno', 'pqr', 'stu', 'vwx', 'yz&']
# I want a string up to 'def' from 'vwx', all in between
# from 'vwx' so -2;to 'def' just before 'abc' so -9; backwards all so -1.
>>> l[-2:-9:-1]
['vwx', 'stu', 'pqr', 'mno', 'jkl', 'ghi', 'def']
# For the same 'vwx' 7 to 'def' just before 'abc' 0, backwards all -1
>>> l[7:0:-1]
['vwx', 'stu', 'pqr', 'mno', 'jkl', 'ghi', 'def']
Please do not become listless about list.
- Write the first element first. You can use positive or negative index for that. I am lazy so I use positive, one stroke less (below 7, or -3 for the start).
- Index of the element just before where you want to stop. Again, you can use positive or negative index for that (below 2 or -8 for stop).
Here sign matters; of course - for backwards; value of stride you know. Stride is a 'vector' with both magnitude and direction (below -1, backwards all).
l = [0,1,2,3,4,5,6,7,8,9] l[7:2:-1], l[-3:2:-1], [-3:-8:-1],l[7:-8:-1]All result in
[7, 6, 5, 4, 3].
Videos
Although I know how slicing works but following examples kind of stumped me.
values = [3,4,3,7,8,9,5] values[:3:-1] #o/p [5,9,8] values[5:3:-1] #o/p [9,8]
I always thought in list[start:stop:step], 'start' defaults to 0, 'stop' defaults to length-1 and 'step' defaults to 1. But this doesn't make sense here. What are the rules? Link to official docs will also be appreciated as I couldn't find that.
[-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'
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.
You should use in reverse order
a[-4:-1]
# gjo
you should actually use
a[-3:]
# job
if you want to reverse the string
a[-1:-4:-1]
# boj
Slice notation is like this:
a[start:stop:step]
This gets the elements from index start up to (but not including) index stop incremented by step. By default step is 1, so you get an empty string since your start is already bigger than your stop.
Our first step is to fix the order of the indexes:
>>> a[-4:-1]
'gjo'
But this still isn't quite right. For negative indexing, the last character is at index -1, the next to the last at -2, etc. The best way to think about this is to get the last n characters of the string, you need to start at index -n. So let's starting at -3 to get the last three characters:
>>> a[-3:-1]
'jo'
But we are still missing the last character. This is because the last index is not included in the slice. The last fix is to leave out the last index:
>>> a[-3:]
'job'
Leaving out the last index tells python to slice the string until the end of the string.
Hi everyone!
I’m learning Python and came across the slicing syntax [::-1].
I know it reverses a list, but I don’t fully understand how the negative step works internally.
nums = [1, 2, 3, 4]
print(nums[::-1])
Can someone explain what start:stop:step means in this context and why -1 reverses the order?
Not homework — just trying to understand slicing better.
Thanks!