2011-01-15 8 views
1

Ich versuche, eine nette Schnittstelle zu schaffen, um auf einen Datensatz zuzugreifen, wo jeder Wert mehrere mögliche Schlüssel hat. Nehmen wir zum Beispiel an, dass ich sowohl einen Nummer als auch einen Namen für jeden Wert im Datensatz habe. Ich möchte in der Lage sein, auf jeden Wert entweder mit der Zahl ODER dem Namen zuzugreifen.Wörterbücher mit mehr als einem Schlüssel pro Wert in Python

Ich habe als mehrere mögliche Implementierungen:

  1. Verwendung von zwei separaten Wörterbücher, ein für die Datenwerte nach Anzahl organisiert, und eine für die Datenwerte nach Namen organisiert.

  2. Einfach zwei Schlüssel dem gleichen Wert in einem Wörterbuch zuweisen.

  3. Erstellen Wörterbücher jede Namenszuordnung zu der entsprechenden Anzahl und vice versa

  4. Versuch, eine Hash-Funktion zu erstellen, die jeden Namen auf eine Zahl abbildet, usw. (bezogen auf die oben)

  5. Erstellen eines Objekts zum Verkapseln aller drei Datenelemente, dann Verwenden eines Schlüssels zum Zuordnen von Wörterbuchschlüsseln zu den Objekten und Durchsuchen des Wörterbuchs, um den anderen Schlüssel dem Objekt zuzuordnen.

Keines scheint ideal. Das erste scheint hässlich und nicht zu halten. Die zweite scheint ebenfalls fragil. Das dritte/vierte scheint plausibel, scheint aber entweder eine sehr manuelle Spezifikation oder eine zu komplexe Implementierung zu erfordern. Schließlich verliert der fünfte die konstante Zeitleistung für eines der Nachschlagevorgänge.

In C/C++ glaube ich, dass ich Zeiger verwenden würde, um das gleiche Stück Daten von verschiedenen Schlüsseln zu referenzieren.

Ich weiß, dass das Problem ähnlich zu einem Datenbank-Lookup-Problem durch eine Nicht-Schlüsselspalte ist, jedoch möchte ich (wenn möglich) die ungefähre O (1) Leistung von Python-Wörterbüchern beibehalten.

Was ist der pythonischste Weg, um diese Datenstruktur zu erreichen?

Antwort

5
In C/C++, I believe that I would use pointers to reference the same piece of 
data from different keys. 

Diese mit Option Nummer 2. In Python entsprechen würde, speichern Wörterbücher wirklich Zeiger auf Objekte. Das heißt, wenn zwei Schlüssel auf dasselbe Objekt zeigen, wird das Objekt nicht zweimal erstellt.

1

Sind sowohl die Namen als auch die Nummern eindeutig? Den einen zu benutzen, um den anderen zuerst zu finden, ist nicht so schlimm.

Und zwei Wörterbücher, die auf die gleichen Daten zeigen, wie in C, werden die Daten nicht duplizieren, und es ist auch in Ordnung.

Einkapselung der beiden dictonaries in ein in sich geschlossenes Objekt mit add(name,number,value) und findByName(name), findByNumber(number), lassen Sie die Wartung zentralisieren, sein prüfbar & so weiter.

(verzeihen Sie meine camelcase :)

1

Betrachten Sie es auf diese Weise: Sie sind in allem Wesen wollen eine dreispaltige Datenbank, wo zwei Spalten indiziert sind, aber mit der Vereinfachung, dass Sie nicht in der Lage sein sollen, die indizierten Werte nachschlagen.

Option 5 versucht in der Praxis, eine solche vereinfachte Datenbank zu erstellen. Und wenn Sie eine solche Datenbank im Speicher erstellen, erhalten Sie eine Zuordnung von einer UID zu den Werten, die Sie haben (in diesem Fall nur eine, da Sie nur eine Spalte haben) und die Indizes von Werten auf UIDs abgebildet werden .

In Ihrem Fall haben Sie bereits eine Nummer, die Sie als UID verwenden können, also brauchen Sie keine "Spalte" dafür.

Das bedeutet, dass Sie mit zwei Wörterbüchern enden: Eine Zuordnungsnummer, die zu bewerten ist, und eine, die den Namen der Nummer zuordnet.

Also das sollten Sie tun, IMO.

1

In C/C++ glaube ich, dass ich Zeiger verwenden würde, um das gleiche Stück Daten von verschiedenen Schlüsseln zu referenzieren.

Fast alles in Python qualifiziert sich als "C/C++ Zeiger".

Verwenden Sie Ihre Option # 1, zwei Wörterbücher, und testen Sie es auf Leistung. Wenn Sie eine Klasse für den Inhalt definieren, können Konstruktoren und Destruktoren die Wörterbücher verwalten, und die Klasse kann Funktionen für die Suchvorgänge definieren.

Verwandte Themen