2010-02-11 14 views
6

Sto lavorando a un progetto in cui ho bisogno di memorizzare una matrice di numeri indicizzati da due chiavi stringa. La matrice non è frastagliata, cioè se esiste una chiave di colonna per qualsiasi riga, allora dovrebbe esistere per tutte le righe. Allo stesso modo, se una chiave di riga esiste per qualsiasi colonna, dovrebbe esistere per tutte le colonne.Matrici associative?

Il modo ovvio per esprimere questo è con un array associativo di array associativi, ma questo è sia scomodo e inefficiente, e non impone la proprietà di non-jaggedness. Qualche linguaggio di programmazione popolare fornisce una matrice associativa incorporata nella lingua o come parte delle loro librerie standard? In tal caso, come funzionano, sia a livello di API che di implementazione? Sto usando Python e D per questo progetto, ma esempi in altri linguaggi sarebbero ancora utili perché sarei in grado di guardare l'API e capire il modo migliore per implementare qualcosa di simile in Python o D.

risposta

2

Perché non solo usa una matrice standard, ma ha due dizionari, uno che converte le chiavi di riga in indici di riga e uno che converte le chiavi di colonna in indici di colonne. Potresti creare una struttura che funzioni in questo modo abbastanza facilmente, penso. Devi solo creare una classe che contenga la matrice e i due dizionari e andare da lì.

0

In Python si potrebbe avere un dict indicizzato da una tupla di due stringhe, ad esempio

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

io non sono sicuro di quello che "far rispettare non scalettature" significa per voi, ma si potrebbe utilizzare un defaultdict per restituire un valore predefinito per le voci che non sono state esplicitamente impostati, o inizializzare il dict con un valore noto:

>>> 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} 

Se si desidera applicare che solo le chiavi in ​​un insieme noto sono permessi allora suggerisco sottoclasse dict a aggiungi la convalida.

+0

Sì, non conosco bene Python. Non ero consapevole del fatto che tu potessi fare questo, anche se ha senso col senno di poi dato che stai fondamentalmente usando le tuple come chiave. – dsimcha

+0

funziona molto bene, ma userà più memoria per memorizzare i tasti che pensavo facessero parte di ciò che non volevi. Tuttavia, dovrebbe essere un po 'più veloce del metodo che ho suggerito, che richiederà l'hash table look-up per trovare gli indici della matrice prima di accedere alla matrice. Velocità o spazio: questa è la domanda. –

+0

@Justin: È una buona idea, ma spero in una risposta migliore. Idealmente mi piacerebbe una matrice "reale", in cui posso ottenere tutte le righe per una singola colonna, o tutte le colonne per una singola riga, ecc., Non solo una soluzione alternativa. – dsimcha

0

il modulo larry per Python è stato rilasciato di recente. credo che faccia quello che vuoi.