dictionary: wert gegeben suche Key

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.
Antworten
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

Sonntag 6. Januar 2008, 16:28

Hallo und ein gesundes neues Jahr.

Ich hab gerade mal wieder nen totalen Knoten im Kopf. Problem: ich habe ein Dictionary, wo jedem Schlüssel genau ein Wert zugeordnet ist, also ganz einfach.

Nun ist es in dem Fall so, dass ich den Wert gegeben habe und nun den Schlüssel dazu suche. Ich habe schon eine Weile rumprobiert, aber irgendwie hab ich es net hinbekommen und das ganz nun so gelöst:

Code: Alles auswählen

for e in bl_dict.iteritems():
	    if fc_name[0:2] in e:
		ags = e[0]
finde das ganze sehr sehr unschön und umständlich. Gibt es irgendeine Dictionary Funktion, mit der ich den Key zu einem Wert auslesen kann? Hab schon eine Weile gesucht, aber da nix gefunden. Hab das bisher auch sorum noch nicht gebraucht, da ich aus dem selben dict. normalerweise den Wert auslese und den Schlüssel gegeben hab.
Benutzeravatar
nkoehring
User
Beiträge: 543
Registriert: Mittwoch 7. Februar 2007, 17:37
Wohnort: naehe Halle/Saale
Kontaktdaten:

Sonntag 6. Januar 2008, 16:47

Hallo und auch dir ein gesundes neues Jahr meneliel!


Also soweit ich weiß, gibt es keine direkte Methode, wie du sie suchst.
An sich sollte es aber nicht so schwer sein:

Code: Alles auswählen

for key, value in bl_dict.iteritems():
    if value == fc_name:
        ags = key
        break
...ungetestet, abe sollte gehen. Wobei es nicht viel anders ist, als deine Funktion.

Evtl lohnt sich auch ein Blick in das Modul itertools ...

Gruß
NKoehring
[url=http://www.python-forum.de/post-86552.html]~ Wahnsinn ist auch nur eine andere Form der Intelligenz ~[/url]
hackerkey://v4sw6CYUShw5pr7Uck3ma3/4u7LNw2/3TXGm5l6+GSOarch/i2e6+t2b9GOen7g5RAPa2XsMr2
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Sonntag 6. Januar 2008, 16:50

Wobei man so nur den ersten Treffer erhält! (Kann ja sein, dass nur das gewollt ist, wenn nicht, müßte man die Treffer in der Schleife "sammeln")
BlackJack

Sonntag 6. Januar 2008, 18:05

In dem Fall geht's mit einer "list comprehension":

Code: Alles auswählen

needle = fc_name[0:2]
keys = [key for key, value in bl_dict.iteritems() if value == needle]
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Montag 7. Januar 2008, 14:58

Wenn die Funktionalität öfter gefordert ist, wird's natürlich unperformant. Eventuell wäre dann eine Datenbank besser geeignet als ein dictionary.
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Montag 7. Januar 2008, 17:12

Brauch man beide Richtungen, brauch man halt 2 dicts.

ein "umgekehrtes dictionary" kann man so aus einem Vorhandenen erstellen:

Code: Alles auswählen

d = {1 : 'eins', 2 : 'zwei'}
rd = dict((v, k for k, v in d.iteritems()))
Das erstellte Dictionary hat dann auch einen prima lookup-aufwand (wenn auch die Erstellung einmalig einen unhübschen hat).

Aber vermutlich ist es intelligenter, die Dictionaries gemeinsam zu befüllen.
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Dienstag 8. Januar 2008, 13:45

keppla hat geschrieben:Brauch man beide Richtungen, brauch man halt 2 dicts.
[...]Aber vermutlich ist es intelligenter, die Dictionaries gemeinsam zu befüllen.
Guter Einwand, daran habe ich nicht gedacht.
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

Freitag 18. Januar 2008, 18:10

Danke für Eure Vorschläge.

Das umgekehrte Dictionary brauche ich aber tatsächlich nur an dieser einen Stelle.
@nkoehring: Deine Variante sieht natürlich aber ein bisschen eleganter aus, als das Konstrukt von mir. Aber stimmt, so geht das ja auch noch.

Mit den Itertools hab ich da schon rumgespielt, aber irgendwie ging da nix.

@ Blackjack: so sieht das natürlich kompackt und elegant aus :). Irgendwie schaffst du es immerwieder für irgendwelche längeren konstrukte meinerseits eine ganz kompakte schicke Variante zu finden :). List List comprehensions hab ich bisher irgendwie noch gar nicht gearbeitet ... aber man lernt ja immer dazu :)

Ich brauch in dem Fall wirklich nur den einen einzigen Treffer, den es gibt für jeden Schleifendurchlauf.
Antworten