Skip to content Skip to sidebar Skip to footer

Extended Slice That Goes To Beginning Of Sequence With Negative Stride

Bear with me while I explain my question. Skip down to the bold heading if you already understand extended slice list indexing. In python, you can index lists using slice notation

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 or j is negative, the index is relative to the end of the string: len(s) + i or len(s) + j is substituted. But note that -0 is still 0.

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"