2010-12-10 13 views
5

配列/行列の値を要求するのに、境界外インデックスのデフォルト(0)値を報告するのに良い方法が必要です:
b [2 ] [4]は、2番目のインデックスの長さが3の場合は0を返し、
b [-1] [2]
Getting a default value on index out of range in Pythonをチェックしましたが、負のインデックスでは機能しません。 (true?)
私は__getitem__のオーバーロードの行に沿って考えていましたが、私はちょうど1ヶ月前にPythonに来て、私はとても熟練していません...python:インデックスの範囲外のインデックスの配列のデフォルト値

何か助けていただければ幸いです!

アレッサンドロ

+0

あなたのコード出力は? – pyfunc

答えて

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 == dict。私はキーのタプルを使って(入れ子ではなく)ただ一つのdictを使うというファンです。 '行列[2、4]' –

+0

@Ben:タプルは、2次元配列でより良いインデックスを作成することに同意します。しかしながら、指数を分離させることは、OPの質問の要件であった。 –

+0

- ああ、私はあなたの答え以上の姪を選んでいない、これはちょうど提案をする自然な場所のように見えた。 :-) –

0

私はこの問題を混乱させると思います。

listy[-1]は、真の指標は、LEN(listy)に等しい場合、

listy[-2]真のインデックスは、(listy)-1でlen ...ので

にするよう相対指標であります相対インデックスが存在しない場合は、まだIndexErrorが発生します。 [][0]またはこの[1][-2]

0

常に(本当?)彼らに、配列の長さを追加

組み込みのPythonシーケンスではこれが行われますが、Pythonコンパイラではなく、それらのシーケンスの実装ではわかります。だから、あなたは__getitem__(または__getslice__)に負の値を受け取り、あなたが望むようにそれらを扱うことができます。

0

一般的な知識のために、GetItemメソッドSetItem関数の使用量がこれです:あなたがリストクラス(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使い方に興味があるので、それを行う方法です。 お楽しみください:)

関連する問題