2010-12-10 32 views
5

我需要一个好的方法来请求数组/矩阵值,但报告出界索引的默认值(0):
b [2 ] [4]应该返回0如果第二个索引长度是3,并且
b [-1] [2]也
我检查了这个: Getting a default value on index out of range in Python,但在我看来,它不适用于负指数 - 因为python总是给它们添加数组长度(true?)
我正在考虑沿着超载线__getitem__,但是我刚刚在1个月前来到python,并且我没有那么熟练......python:索引超出界限的数组默认值

任何帮助表示赞赏!

alessandro

+0

和您的代码输出是? – pyfunc 2010-12-10 21:42:26

回答

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

+1为稀疏“数组”==字典。我喜欢用单个字典(而不是嵌套)与元组的密钥,例如'矩阵[2,4]'。 – 2010-12-10 22:08:12

+0

@Ben:我同意,元组在二维数组中有更好的索引。但是,将指数分开是OP的问题中的一个要求。 – 2010-12-10 22:29:08

+0

- 哦,我没有在你的回答中选择尼克斯,这似乎是提出建议的理由。 :-) – 2010-12-10 22:31:32

0

我觉得你的问题混淆了。

listy[-1]相对指数,使得真正的指数等于LEN(listy),

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

如果相对指数不存在,它仍然会提高IndexError。像这样的:[][0]或本[1][-2]

0

因为Python总是数组的长度添加到他们(?真)

内置的Python序列可以做到这一点,但据我所知可以通过这些序列的实现来完成,而不是由Python编译器完成。所以不,你会在你的__getitem__(或__getslice__)收到负值,并且可以按照你的意愿处理它们。

0

对于一般知识来说,的GetItemsetitem的用法是这样的:

如果重写列表类(class newListClass(list):),并希望(对象类中)

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

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

使用您自己的getitem中的列表的getitem,您需要编写:

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

这样你也可以从这个getitem中发现异常,并返回你想要的东西。 这不是你的问题的答案,马丁的是..但你对getitem用法感兴趣,所以这就是做它的方式。 享受:)