2010-12-10 14 views
5

Necesito una buena forma de solicitar un valor de matriz/matriz, pero notificando un valor predeterminado (0) para un índice fuera de límite:
b [2 ] [4] debería devolver 0 si la 2da longitud del índice es 3, y
b [-1] [2] también
Comprobé esto: Getting a default value on index out of range in Python, pero me parece que no funcionaría para los índices negativos - Como Python siempre añadir la longitud de la matriz a ellos (verdad?)
yo estaba pensando a lo largo de la línea de sobrecargar __getitem__, pero acabo de llegar a pitón hace 1 mes, y no soy tan hábil ...python: valor predeterminado de matriz para índice fuera de límites

¡cualquier ayuda apreciada!

alessandro

+0

y la salida de su código es? – pyfunc

Respuesta

8

Si desea una matriz dispersa de manera indefinida de tamaño, puede utilizar 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 para "matriz" dispersa == dict. Soy fanático de utilizar solo un dict (en lugar de anidado) con tuplas para claves, p. 'matriz [2, 4]'. –

+0

@Ben: Estoy de acuerdo, las tuplas hacen mejores índices en arreglos bidimensionales. Sin embargo, tener los índices separados era un requisito en la pregunta del PO. –

+0

- Oh, no estaba recogiendo liendres sobre su respuesta, este parecía el lugar natural para hacer la sugerencia. :-) –

0

Creo que estás confundiendo el problema.

listy[-1] es una relativa índice de tal manera que, el verdadero índice es igual a len (listy),

listy[-2] cierto índice se len (listy) -1, ... y así sucesivamente

Si el el índice relativo no existe, aún aumentará un IndexError. Como este: [][0] o esta [1][-2]

0

desde pitón añadir siempre la longitud de la matriz a ellos (? Real)

Las secuencias de Python incorporadas hacen esto, pero por lo que puedo decir es hecho por las implementaciones de esas secuencias, no por el compilador de Python. Así que no, recibirá valores negativos en su __getitem__ (o __getslice__) y puede manejarlos como lo desee.

0

para general conocimiento, el uso de GetItem y SetItem es la siguiente:

(dentro de la clase de objeto)

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

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

si sustituir la clase de lista (class newListClass(list):), y desea utilice el getitem de la lista dentro de su propio getitem, debe escribir:

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

de esta manera también puede detectar excepciones de este getitem y devolver lo que desee. esa no es una respuesta para su problema, Martin es ... pero está interesado en el uso de getitem, así que esa es la manera de hacerlo. enjoy :)

Cuestiones relacionadas