Zwei-Wege Value-setzen in einem Dict

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Zwei-Wege Value-setzen in einem Dict

Beitragvon Dauerbaustelle » Donnerstag 1. Mai 2008, 19:47

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ß
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Beitragvon numerix » Donnerstag 1. Mai 2008, 20:39

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.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Beitragvon birkenfeld » Donnerstag 1. Mai 2008, 20:41

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 :)
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Beitragvon Dauerbaustelle » Freitag 2. Mai 2008, 22:15

@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 :)
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Beitragvon birkenfeld » Samstag 3. Mai 2008, 07:29

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.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]