Seite 1 von 1

dictionary: wert gegeben suche Key

Verfasst: Sonntag 6. Januar 2008, 16:28
von meneliel
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.

Verfasst: Sonntag 6. Januar 2008, 16:47
von nkoehring
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

Verfasst: Sonntag 6. Januar 2008, 16:50
von Hyperion
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")

Verfasst: Sonntag 6. Januar 2008, 18:05
von BlackJack
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]

Verfasst: Montag 7. Januar 2008, 14:58
von mkesper
Wenn die Funktionalität öfter gefordert ist, wird's natürlich unperformant. Eventuell wäre dann eine Datenbank besser geeignet als ein dictionary.

Verfasst: Montag 7. Januar 2008, 17:12
von keppla
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.

Verfasst: Dienstag 8. Januar 2008, 13:45
von mkesper
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.

Verfasst: Freitag 18. Januar 2008, 18:10
von meneliel
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.