class n_based_list(list):
def __init__(self, startidx, items):
self.start = startidx
list.__init__(self, items)
def idx(self, i):
return i - self.start
def insert(self, i, x):
return list.insert(self, self.idx(i), x)
def pop(self, i):
return list.pop(self, self.idx(i))
def __getslice__(self, i, j):
return list.__getslice__(self, self.idx(i), j)
def _handle_slice(self, s):
return slice(self.idx(s.start or self.start),
s.stop,
s.step)
def __getitem__(self, i):
if isinstance(i, slice):
return list.__getitem__(self, self._handle_slice(i))
return list.__getitem__(self, self.idx(i))
def __setitem__(self, i, x):
if isinstance(i, slice):
return list.__setitem__(self, self.handle_slice(i), x)
return list.__setitem__(self, self.idx(i), x)
def __delitem__(self, i):
if isinstance(i, slice):
return list.__delitem__(self, self._handle_slice(i))
return list.__delitem__(self, self.idx(i))
def enumerate(self):
for i, elt in enumerate(self):
yield i+self.start, elt
def test_n_based_list():
l = n_based_list(1, ['a', 'b', 'c', 'd'])
assert l[1] == 'a'
assert l[0] == 'd' # yuck!
assert l[2] == 'b'
assert l[3] == 'c'
assert l[4] == 'd'
assert l.pop(1) == 'a'
assert l == ['b', 'c', 'd']
l.insert(1, 'a')
assert l[1] == 'a'
assert l[1:3] == ['a', 'b', 'c']
assert l[1::2] == ['a', 'c']
del l[::2]
assert l == ['b', 'd']
new_l = n_based_list(1, ['a', 'b', 'c', 'd'])
assert list(new_l.enumerate()) == [(1, 'd'),
(2, 'a'),
(3, 'b'),
(4, 'c')]
23 April 2007
N-based Python list
Solving http://www.answermysearches.com/python-subclassing-list-to-make-it-n-based/251/
(with some light testing)