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

7
我需要一种好的方法来请求数组/矩阵值,但是对于越界索引要报告默认值(0):
如果第2个索引长度为3,则b[2][4]应返回0,
同样地,如果b[-1][2]也是如此。
我查过这个问题:在Python中获取索引超出范围的默认值,但我认为它不能用于负索引 - 因为Python总是将数组长度添加到它们中(true?)
我考虑重载__getitem__,但我刚学Python一个月,技术还不够熟练...
任何帮助都会感激!
alessandro
4个回答

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
对于稀疏“数组”,使用字典比较好。我喜欢只使用单个字典(而不是嵌套字典),并用元组作为键,例如 matrix[2, 4] - Ben Blank
@Ben:我同意,元组在二维数组中作为索引更好。然而,在OP的问题中,将索引分开是一个要求。 - Martin v. Löwis
哦,我并不是在挑剔你的回答,只是这似乎是提出建议的自然场所。 :-) - Ben Blank
1
你也可以使用 defaultdict(lambda: defaultdict(int)) - int() is 0 - Chris Morgan
@Ben Blank - 我之前不知道那是有效的Python语法...谢谢 :) - detly

0

对于一般知识,getitemsetitem的用法如下:

(在对象类内部)

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的异常并返回你想要的结果。

这不是解决你问题的答案,Martin的回答才是。但如果你对getitem的使用感兴趣,那么这就是实现它的方法。

祝愉快 :)


0

我认为你混淆了问题。

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

listy[-2] 的真正索引是len(listy)-1,...以此类推

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


0

因为Python总是将数组长度添加到它们中(对吗?)

Python内置的序列会这样做,但据我所知,这是由这些序列的实现完成的,而不是由Python编译器完成的。因此,在您的 __getitem__ (或 __getslice__ )中,您将收到负值,并可以按照您的意愿进行处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接