2010-02-11 11 views
6

Estoy trabajando en un proyecto en el que necesito almacenar una matriz de números indexados por dos claves de cadena. La matriz no está dentada, es decir, si existe una clave de columna para cualquier fila, entonces debería existir para todas las filas. De forma similar, si existe una clave de fila para cualquier columna, entonces debería existir para todas las columnas.Matrices asociativas?

La forma más obvia de expresar esto es con una matriz asociativa de matrices asociativas, pero esto es incómodo e ineficiente, y no impone la propiedad no irregular. ¿Algún lenguaje de programación popular proporciona una matriz asociativa integrada en el lenguaje o como parte de sus bibliotecas estándar? De ser así, ¿cómo funcionan, tanto en la API como en el nivel de implementación? Estoy usando Python y D para este proyecto, pero los ejemplos en otros idiomas todavía serían útiles porque podría ver la API y descubrir la mejor manera de implementar algo similar en Python o D.

Respuesta

2

¿Por qué? no solo usa una matriz estándar, sino que tiene dos diccionarios: uno que convierte las claves de las filas en índices de las filas y otro que convierte las claves de las columnas en índices de las columnas. Podrías crear tu propia estructura que funcionaría de esta manera con bastante facilidad, creo. Usted acaba de hacer una clase que contiene la matriz y los dos diccionarios e ir desde allí.

0

En Python que podría tener un diccionario indexado por una tupla de dos cuerdas, por ejemplo

>>> d = {} 
>>> d["foo","bar"] = 10 
>>> d 
{('foo', 'bar'): 10} 

No estoy seguro de lo que "hacer cumplir no jaggedness" significa para usted, pero usted podría utilizar un defaultdict a devolver un valor predeterminado para las entradas que no han sido establecidos de forma explícita, o inicializar el dict con un valor conocido:

>>> xkeys = "abcdef" 
>>> ykeys = "xyz" 
>>> d = dict(((x,y), 0) for x in xkeys for y in ykeys) 
>>> d 
{('b', 'y'): 0, ('a', 'z'): 0, ('b', 'x'): 0, ('e', 'y'): 0, ('a', 'x'): 0, ('f', 'z'): 0, ('a', 'y'): 0, ('f', 'y'): 0, ('d', 'y'): 0, ('f', 'x'): 0, ('d', 'x'): 0, ('e', 'x'): 0, ('e', 'z'): 0, ('c', 'x'): 0, ('d', 'z'): 0, ('c', 'y'): 0, ('c', 'z'): 0, ('b', 'z'): 0} 

Si desea exigir que sólo pueden introducirse en un conjunto conocido se permite entonces le sugiero la subclasificación dict a agregar la validación

+0

Sí, realmente no conozco Python tan bien. No sabía que pudieras hacer esto, aunque tiene sentido en retrospectiva dado que básicamente estás usando tuplas como clave. – dsimcha

+0

esto funciona muy bien, pero usará más memoria para almacenar las claves que pensé que era parte de lo que no quería. Sin embargo, debería ser un poco más rápido que el método que sugerí, que requerirá búsquedas en la tabla hash para encontrar los índices matriciales antes de acceder a la matriz. Velocidad o espacio: esa es la pregunta. –

+0

@Justin: Es una buena idea, pero espero una mejor respuesta. Lo ideal es que me gustaría una matriz "real", donde puedo obtener todas las filas para una sola columna, o todas las columnas para una sola fila, etc., no solo una solución alternativa. – dsimcha

0

el módulo larry para Python fue lanzado recientemente. creo que hace lo que quieres

Cuestiones relacionadas