这是一个完整的(我认为)基于1的列表的实现,正确处理切片(包括扩展切片),索引,弹出等等.比你想象的要好一些,特别是切片和负索引,这有点棘手.事实上,我仍然没有100%确定它的工作原理应该如此,因此需要注意.
class list1(list):
"""One-based version of list."""
def _zerobased(self, i):
if type(i) is slice:
return slice(self._zerobased(i.start),
self._zerobased(i.stop), i.step)
else:
if i is None or i < 0:
return i
elif not i:
raise IndexError("element 0 does not exist in 1-based list")
return i - 1
def __getitem__(self, i):
return list.__getitem__(self, self._zerobased(i))
def __setitem__(self, i, value):
list.__setitem__(self, self._zerobased(i), value)
def __delitem__(self, i):
list.__delitem__(self, self._zerobased(i))
def __getslice__(self, i, j):
print i,j
return list.__getslice__(self, self._zerobased(i or 1),
self._zerobased(j))
def __setslice__(self, i, j, value):
list.__setslice__(self, self._zerobased(i or 1),
self._zerobased(j), value)
def index(self, value, start=1, stop=-1):
return list.index(self, value, self._zerobased(start),
self._zerobased(stop)) + 1
def pop(self, i):
return list.pop(self, self._zerobased(i))
不过,senderle的ExtraItemList会有更好的性能,因为它不需要经常调整索引,也不需要在你和数据之间有一层额外的(非C!)方法调用.希望我能想到这种方法;也许我可以将它与我的合并…