python索引从1开始_自定义包装器,用于索引从1开始的python列表

这是一个完整的(我认为)基于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!)方法调用.希望我能想到这种方法;也许我可以将它与我的合并…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值