10.4. Matrices dispersas

En la Sección 8.14 usamos una lista de listas para representar una matriz. Es una buena opción para una matriz en la que la mayoría de los valores es diferente de cero, pero piense en una matriz como esta:

0 2 0 0 0
0 0 0 1 0
0 0 0 0 0
0 0 0 3 0
0 0 0 0 0

La representación de la lista contiene un montón de ceros:

 

   1: matriz = [ [0,0,0,1,0],

   2:            [0,0,0,0,0],

   3:            [0,2,0,0,0],

   4:            [0,0,0,0,0],

   5:            [0,0,0,3,0] ]

Una posible alternativa es usar un diccionario. Como claves, podemos usar tuplas que contengan los números de fila y columna. Esta es la representación de la misma matriz por medio de un diccionario:

   1: matriz = {(0,3): 1, (2, 1): 2, (4, 3): 3}

Solo hay tres pares clave-valor, una para cada elemento de la matriz diferente de cero. Cada clave es una tupla, y cada valor es un entero.

Para acceder a un elemento de la matriz, podemos usar el operador []:

   1: matriz[0,3]

   2: 1

Fíjese en que la sintaxis para la representación por medio del diccionario no es la misma de la representación por medio de la lista anidada. En lugar de dos índices enteros, usamos un índice que es una tupla de enteros.

Hay un problema. Si apuntamos a un elemento que es cero, se produce un error porque en el diccionario no hay una entrada con esa clave:

   1: >>> matriz[1,3]

   2: KeyError: (1, 3)

El metodo get soluciona este problema:

   1: >>> matriz.get((0,3), 0)

   2: 1

El primer argumento es la clave; el segundo argumento es el valor que debe devolver get en caso de que la clave no este en el diccionario:

   1: >>> matriz.get((1,3), 0)

   2: 0

get mejora sensiblemente la semántica del acceso a una matriz dispersa. Lástima de sintaxis.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s