2013-05-28 8 views
13

eine Eins-zu-Eins-Wörterbuch Given (= Bijektion) erzeugt à laGibt es eine bessere Möglichkeit, ein zweiseitiges Wörterbuch zu speichern, als seine inverse separate zu speichern?

for key, value in someGenerator: 
    myDict[key] = value 

eine inverse Lookup-Wörterbuch kann durch Zugabe von

invDict[value] = key 

zum for Schleife trivially erstellt werden. Aber ist das ein pythonischer Weg? Soll ich stattdessen eine class Bijection(dict) schreiben, die dieses invertierte Wörterbuch zusätzlich verwaltet und eine zweite Lookup-Funktion bereitstellt? Oder existiert eine solche Struktur (oder eine ähnliche) bereits?

+5

Was ist mit diesem [bidict] ( –

+0

@ JonClements klingt perfekt, danke!) Ich würde das als Antwort akzeptieren. Die Verwendung von Slices für die umgekehrte Suche ist eine großartige Idee. –

+1

"Bidict" umklammert nur zwei separate Python-Wörterbücher mit Vorwärts- und Rückwärts-Mappings, so dass es nicht effizienter ist, als das selbe selbst zu tun. In der Tat, wenn Sie viele Schlüssel-Lookups machen, wird es aufgrund des Funktionsaufruf-Overheads viel langsamer sein. – Aya

Antwort

5

Was ich in der Vergangenheit getan habe, ist eine reversedict-Funktion, die ein dict und Rückgabe der umgekehrten Zuordnung, entweder Werte zu Schlüsseln, wenn ich wusste, dass es eins zu eins war (werfen Ausnahmen beim Sehen der gleichen) erstellt Wert zweimal) oder Werte zu Schlüssellisten, wenn dies nicht der Fall war. Auf diese Weise konnte ich, anstatt jedes Mal, wenn ich die umgekehrte Suche machen wollte, zwei Dicts gleichzeitig konstruieren, meine Dicts als normal erzeugen und einfach die generische reversedict Funktion am Ende aufrufen.

Es scheint jedoch, dass die bidict Lösung, die Jon in den Kommentaren erwähnt, wahrscheinlich die bessere ist. (Meine reversedict Funktion scheint sein Bidict ~ Operator zu sein).

+0

Bidict ist perfekt für meine Zwecke - es speichert im Grunde das inverse Wörterbuch innerhalb, aber verbessert den Zugriff mit dem Slice-Operator –

0

Wenn Sie O (log (n)) Zeit für den Zugriff auf Werte benötigen, benötigen Sie sowohl eine Darstellung der Karte als auch eine Darstellung der inversen Karte.

Ansonsten ist das Beste, was Sie tun können, O (log (n)) in der einen Richtung und O (n) in der anderen Richtung.

Edit: nicht O (log (n)), danke Claudiu, aber Sie werden immer noch zwei Datenstrukturen benötigen, um die Schnellzugriffszeiten zu implementieren. Und dies wird mehr oder weniger der gleiche Raum sein wie ein Diktat und ein umgekehrtes Diktat.

+1

dicts haben keine O (log (n)) Look-up, sie haben amortisiert O (1) lookup ... – Claudiu

+0

yeah, sollte das geschaut haben, bevor ich gepostet :) – Zackkenyon

Verwandte Themen