python:索引越界的数组默认值

时间:2010-12-10 21:39:57

标签: python arrays

我需要一个很好的方法来询问数组/矩阵值,但是为越界索引报告默认值(0):
如果第二个索引长度为3,则b [2] [4]应返回0,并且
b [-1] [2]也
我查了一下: Getting a default value on index out of range in Python,但在我看来它对负指数不起作用 - 因为python总是向它们添加数组长度(是真的吗?)
我正在考虑重载__getitem__的问题,但我刚刚在1个月前来到python,我不是那么熟练......

任何帮助表示赞赏!

的Alessandro

4 个答案:

答案 0 :(得分:8)

如果你想要一个无限大小的稀疏矩阵,你可以使用defautldict:

py> matrix=defaultdict(lambda:defaultdict(lambda:0))
py> matrix[2][4]
0
py> matrix[2][4]=8
py> matrix[2][4]
8
py> matrix[-1][2]
0

答案 1 :(得分:0)

我认为你混淆了这个问题。

listy[-1]是一个相对索引,真正的索引等于len(listy),

listy[-2]真正的索引是len(listy)-1,......等等

如果相对索引不存在,它仍会引发IndexError。例如:[][0]或此[1][-2]

答案 2 :(得分:0)

  

因为python总是向它们添加数组长度(是吗?)

内置的Python序列执行此操作,但据我所知,这些序列的实现完成,而不是Python编译器。所以不,你会在__getitem__(或__getslice__)中收到负值,并可以按照自己的意愿处理。

答案 3 :(得分:0)

对于一般知识, getitem setitem 的使用是这样的:

(内部对象类)

def __getitem__(self,index):
    print index
    return self.mylist[index]

def __setitem__(self,index,value):
    self.mylist[index]=value

如果你覆盖列表类(class newListClass(list):),并想在你自己的getitem中使用列表的getitem,你需要写:

class newListClass(list):
    def __getitem__(self,index):
        return list.__getitem__(self,index)

这样你也可以从 getitem 中捕获异常并返回你想要的内容。 这不是你的问题的答案,马丁是...但你对 getitem 的使用感兴趣,所以就这样做了。 享受:)