Seite 1 von 1

Zwei-Wege Value-setzen in einem Dict

Verfasst: Donnerstag 1. Mai 2008, 19:47
von Dauerbaustelle
Hallo,
hab hier ein Dict
{ key1: value1, key2: value2 } oder was auch immer, ist ja egal.

Jetzt möchte ich die Möglichkeit haben, "Zwei-Wege" zu setzen. Das heißt, ich möchte über die Angabe von key value setzen und über die Angabe von value key setzen.

Aussehen würde dies dann so:
dict[key1] = abcde
dict[value1] abcde

Wie realisiere ich sowas? Ich dachte mir, nimmst du doch im Falle des key-Setzens durch den value folgenden Vorgang:
* Key rauskriegen, der value als Wert hat
* Den Key:Value aus dem dict löschen
* Neuen Key erstellen mit dem Inhalt des values und als Wert den alten Key, also hab ich nachher value:key
* Dies umdrehen

...andere Ideen?

Gruß

Verfasst: Donnerstag 1. Mai 2008, 20:39
von numerix
Man könnte den Eindruck gewinnen, dass du davon ausgehst, dass ein value pro dictionary genauso einmalig ist wie ein key im dictionary. Im allgemeinen kannst du davon ja nicht ausgehen (es sei denn, deine Datenstruktur bzw. die Daten sind so, dass du das sicher wissen kannst).

Das könnte also bedeuten, dass du mehrere dictionary-Einträge (die alle den gleichen value haben) entfernst, um sie durch einen einzigen neuen Eintrag zu ersetzen.

Verfasst: Donnerstag 1. Mai 2008, 20:41
von birkenfeld
Am simpelsten ist es, zwei Dictionaries zu nehmen:

Code: Alles auswählen

k2v = {}
v2k = {}

def set_key(k, v):
    try:
        v2k.pop(k2v[k])
    except KeyError:
        # Wenn k neu in k2v ist, d.h. k2v[k] fehlschlägt
        pass
    k2v[k] = v
    v2k[v] = k
Das entsprechende set_value() ist dann einfach :)

Verfasst: Freitag 2. Mai 2008, 22:15
von Dauerbaustelle
@birkenfeld: Danke für das "peace of code", leider bin ich noch kein Pythonguru. Könntest du das vielleicht ein bisschen kommentieren, was macht der Code genau und was kommt in die zwei Dics rein?

Danke :)

Verfasst: Samstag 3. Mai 2008, 07:29
von birkenfeld
Das eine Dict mappt Keys zu Values, das andere die Gegenrichtung.
Die Funktion set_key() -- und ein entsprechendes set_value() -- tragen ein Key-Value-Paar in beide Dicts ein, sodass sie konsistent bleiben.