Extended Slice That Goes To Beginning Of Sequence With Negative Stride
Solution 1:
It is error-prone to change the semantics of start
and stop
. Use None
or -(len(a) + 1)
instead of 0
or -1
. The semantics is not arbitrary. See Edsger W. Dijkstra's article "Why numbering should start at zero".
>>>a = range(10)>>>start, stop, step = 4, None, -1
Or
>>>start, stop, step = 4, -(len(a) + 1), -1>>>a[start:stop:step]
[4, 3, 2, 1, 0]
Or
>>>s = slice(start, stop, step)>>>a[s]
[4, 3, 2, 1, 0]
When s
is a sequence the negative indexes in s[i:j:k]
are treated specially:
If
i
orj
is negative, the index is relative to the end of the string:len(s) + i
orlen(s) + j
is substituted. But note that-0
is still0
.
that is why len(range(10)[4:-1:-1]) == 0
because it is equivalent to range(10)[4:9:-1]
.
Solution 2:
Ok, I think this is probably as good as I will get it. Thanks to Abgan for sparking the idea. This relies on the fact that None in a slice is treated as if it were a missing parameter. Anyone got anything better?
def getReversedList(aList, end, start, step):
return aList[end:start if start!=-1elseNone:step]
edit: check for start==-1
, not 0
This is still not ideal, because you're clobbering the usual behavior of -1. It seems the problem here is two overlapping definitions of what's supposed to happen. Whoever wins takes away otherwise valid invocations looking for the other intention.
Solution 3:
[ A[b] for b in range(end,start,stride) ]
Slower, however you can use negative indices, so this should work:
[ A[b] for b in range(9, -1, -1) ]
I realize this isn't using slices, but thought I'd offer the solution anyway if using slices specifically for getting the result isn't a priority.
Solution 4:
I believe that the following doesn't satisfy you:
def getReversedList(aList, end, start, step):
ifstep < 0and start == 0:
return aList[end::step]
return aList[end:start:step]
or does it? :-)
Solution 5:
But you can't use that if you are storing your indices in variables for example.
Is this satisfactory?
>>>a = range(10)>>>start = 0>>>end = 4>>>a[4:start-1if start > 0elseNone:-1]
[4, 3, 2, 1, 0]
Post a Comment for "Extended Slice That Goes To Beginning Of Sequence With Negative Stride"