0

Have fun with sliced lists: how to get an inverted sublist when using negative indices

I was playing around with slices and negative indexes. If you need an inverted sublist using negative indice, it is best to use a temporary variable to save your sublist before you are going to invert it: squares = [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] print(squares[-5:-3]) print(squares[-5:-3:-1]) print(squares[-3:-5]) print(squares[-3:-5:-1]) print(squares[-4:-6:-1]) print(squares[5:7]) print(squares[5:7:-1]) sublist = squares[-5:-3] print(sublist) print(sublist[::-1]) Line 3 should intuitively lead to the same result as the last line, but it doesn’t.

23rd Oct 2020, 12:49 PM
CMW
6 Respostas
+ 1
On line 3 You are saying to go from -5 to -3 in backward (-1) Which isn't possible So it returns empty list [ ] You should have passed [-3:-5:-1] Hope It Helps You 😊
23rd Oct 2020, 1:01 PM
Hacker Badshah
Hacker Badshah - avatar
+ 1
if you are talking of the following line print(squares[-5:-3:-1]) it returns empty list since you can't have a negative step when you are moving from left to right in squares[-5:-3] the default step is 1 ,it could be re written as squares[-5:-3:1] now it will work fine and slice the values from index -5 to just before -3 i.e. 25,36
23rd Oct 2020, 1:05 PM
Abhay
Abhay - avatar
+ 1
CMW Okay So you want output [36,25] 36 is at -4 (From where our slice will start) 25 is at -5 (From where our slice will end so we'll use -6 as last num is not included) And we want to go backward so step would be -1 >>>squares[-4:-6:-1] [36,25] So whenever wanted to get inverted sublist just pass ‱Index from where to start ‱Then the index where to end -1(+1 if not wanted inverted) ‱And a step of -1 Hope It Helps You 😊
24th Oct 2020, 2:54 PM
Hacker Badshah
Hacker Badshah - avatar
0
Maybe I should have been clearer: the idea was to get the inverse of a sublist, using negative indices. The desired result was [36, 25], the inverse of what you suggest, Abhay. My above code produces the following output: [25, 36] [] [] [49, 36] [36, 25] [25, 36] [] [36, 25] [25, 36] [36, 25] @Hacker Badshah: the fourth line is the output of what you suggested ([49, 36]), but it is not the correct solution to the problem.
24th Oct 2020, 2:07 PM
CMW
0
Thanks Hacker Badshah. I realized that (see line 6 of my code). But I think it is neither an intuitive nor a very elegant solution. Suppose you want to use both the original sublist and its inverse in a piece of code, maybe even with the indices coming out from some calculation: 1. Fine, if you use positive indices: squares[5:7] #sublist 1 squares[5:7:-1] #inverse of sublist 1 2. But the same logic does not work with negative indices squares[-5:-3] #sublist 2 squares[-5:-3:-1] #is not the inverse of sublist 2 sublist3 = squares[-5:-3] sublist3[::-1] #this is the inverse of sublist2 So, instead of tweaking the indices when they are negative and you need the inverse, I think it is more elegant to use an intermediary variable. That way you don't need to think about adjusting indices to get the desired result. Hope I was clear and it helps 🙂
24th Oct 2020, 3:54 PM
CMW
0
Just realized that there was an error in my statement above: squares[5:7:-1] actually does not work (ouput is an empty list []) So, the solution would always be to use an intermediary variable, or to use the shortened form of immediately applying the inversion to the result from the slicing: squares[-5:-3][::-1] # This seems to be the safest way without doing any acrobatics on the index range, in particular if the index values are unknown at runtime print(squares[5:7]) print(squares[5:7][::-1]) print(squares[-5:-3]) print(squares[-5:-3][::-1])
24th Oct 2020, 4:12 PM
CMW