2010-12-10 107 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用法感興趣,所以這就是做它的方式。 享受:)