On 28 October 2013 17:15, Joshua Landau <joshua@landau.ws> wrote:
<suggested using "~" instead of "-">
# Here's a quick mock-up of my idea. class NotSliced(list): def __getitem__(self, itm): if isinstance(itm, slice): start, stop, step = itm.start, itm.stop, itm.step if start is None: start = 0 if stop is None: stop = ~0 if step is None: step = 1 if start < 0: start += len(self) + 1 if stop < 0: stop += len(self) + 1 if step > 0: return NotSliced(super().__getitem__(slice(start, stop, step))) else: return NotSliced(super().__getitem__(slice(stop, start))[::step]) else: return super().__getitem__(itm) ns = NotSliced([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) [ns[i] for i in range(10)] #>>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # See why this is a much better mapping? [list(ns)[-i] for i in range(10)] [ns[~i] for i in range(10)] #>>> [0, 9, 8, 7, 6, 5, 4, 3, 2, 1] #>>> [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] ns[~6:7] list(ns)[-6:7] #>>> [4, 5, 6] #>>> [4, 5, 6] ns[~4:~0][::-1] ns[~0:~4:-1] #>>> [] #>>> [9, 8, 7, 6] ns[~4:~0][::-2] ns[~0:~4:-2] #>>> [] #>>> [9, 7] # Here's something that makes me really feel this is natural. ns[2:~2] #>>> [2, 3, 4, 5, 6, 7] ns[1:~1] #>>> [1, 2, 3, 4, 5, 6, 7, 8] ns[0:~0] #>>> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] # VERSUS (!!!) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9][2:-2] #>>> [2, 3, 4, 5, 6, 7] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9][1:-1] #>>> [1, 2, 3, 4, 5, 6, 7, 8] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9][0:-0] #>>> [] # And some more... ns[~6:6:+1] ns[6:~6:-1] #>>> [4, 5] #>>> [5, 4] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9][-6:6:+1] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9][6:-6:-1] #>>> [4, 5] #>>> [6, 5] # Surely you agree this is much more intuitive. # Another example from the thread a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] for n in reversed(range(7)): print(n, a[:-n]) #>>> 6 [0, 1, 2, 3] #>>> 5 [0, 1, 2, 3, 4] #>>> 4 [0, 1, 2, 3, 4, 5] #>>> 3 [0, 1, 2, 3, 4, 5, 6] #>>> 2 [0, 1, 2, 3, 4, 5, 6, 7] #>>> 1 [0, 1, 2, 3, 4, 5, 6, 7, 8] #>>> 0 [] for n in reversed(range(7)): print(n, ns[:~n]) #>>> 6 [0, 1, 2, 3] #>>> 5 [0, 1, 2, 3, 4] #>>> 4 [0, 1, 2, 3, 4, 5] #>>> 3 [0, 1, 2, 3, 4, 5, 6] #>>> 2 [0, 1, 2, 3, 4, 5, 6, 7] #>>> 1 [0, 1, 2, 3, 4, 5, 6, 7, 8] #>>> 0 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]