自定义包装器,用于索引从1开始的python列表
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了自定义包装器,用于索引从1开始的python列表,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2139字,纯文字阅读大概需要4分钟。
内容图文
![自定义包装器,用于索引从1开始的python列表](/upload/InfoBanner/zyjiaocheng/720/e465c3af78104c1d86f30cd3cf2cd3bb.jpg)
我想为python列表类型编写一个简单的包装器,强制它开始索引为1而不是0.我有一个相当复杂的程序,基于持续时间数据的一些离散概率分布,带有整数长度的桶,但我没有任何持续时间小于1.无论如何,它会大大简化我的代码的一些重要部分,以便能够从1开始无缝索引.我最初使用的是dict,但我发现了它们的几个属性太麻烦了.
我以前从未为Python类编写过包装器,更不用说内置类型了,但我觉得我想做的事情非常简单.至少,我应该可以做这样的事情:
>>> p = one_list([1,2,3,4,5])
>>> for i in range(1,6):
print i, p[i]
1 1
2 2
3 3
4 4
5 5
>>> len(p)
5
但是,如果我可以覆盖列表类的其他一些相关的内置方法,例如index,那将是很好的.
>>> len(p)
5
>>> p.index(p[-1])
5
请分享您关于如何做这样的事情的提示.我正在考虑是否只使用自定义类,但这似乎有点矫枉过正.我也欢迎有关覆盖的有用方法的任何建议.
编辑:后记
我只想指出做这件事并不值得,我之所以接受以下答案的原因并不是因为我试图以他描述的方式实现它,而是因为他帮我实现了这个列表他们自己足够好.
解决方法:
这是一个完整的(我认为)基于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!)方法调用.希望我能想到这种方法;也许我可以将它与我的合并…
内容总结
以上是互联网集市为您收集整理的自定义包装器,用于索引从1开始的python列表全部内容,希望文章能够帮你解决自定义包装器,用于索引从1开始的python列表所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。