Rekursives Vorhandensein eines Wertes

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
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Ich möchte im Dictionary d rekursiv nach dem Wert "x" suchen. Im folgenden Beispiel sollen jeweils nur die Listen in d durchsucht werden (die Werte), nicht aber die Schüsselwörter 'a', 'b' und 'c'. Ich denke, dass man hierfür keine Extra-Funktion schreiben muss... Das geht doch bestimmt auch über iter in Kombination mit einer Abfrage nach dem Typ "Liste" oder so? Also so ein kryptischer Einzeiler :twisted:

Bei mir kommt natürlich immer "no" raus:

Code: Alles auswählen

d = {'a': ["x", "y", "z"], 'b': ["p", "q", "r"], 'c': []}

if "x" in d:
    print "yes"
else:
    print "no"
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

Das folgende hilft bei Deinem Beispiel:

Code: Alles auswählen

Python 2.4.2 (#1, Dec 22 2005, 17:27:39)
[GCC 4.0.2 (Gentoo 4.0.2-r2, pie-8.7.8)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import itertools
>>> d = {'a': ["x", "y", "z"], 'b': ["p", "q", "r"], 'c': []}
>>> for x in itertools.chain(*d.values()): print x
...
x
y
z
p
q
r
>>> "x" in itertools.chain(*d.values())
True
>>> "a" in itertools.chain(*itertools.chain(([x] for x in d.keys()),d.values()))
True
>>>
Wenn die Listen tiefer verschachtelt sind ist das schon ein ganzes Stück schwieriger... Ein "flatten" primitive gibt es in Python noch nicht. Das soll aber in 2.5 ins itertools-Modul kommen.

--- Heiko.
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Was so ein Asterisk alles kann... Ich habe auch schon damit rumgespielt, bekam aber immer einen Syntaxfehler, weil der ja nur bei iter-Werten verwendet werden kann. Das values() hatte ich auch schon im Programm, aber die "itertools" sind mir gänzlich neu.

Die Verschachtelungstiefe reicht für meine Zwecke aus. Vielen Dank!
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

droptix hat geschrieben:die "itertools" sind mir gänzlich neu.
Mir war das auch neu und schon brauch ich's heute. Danke! Tolles Timing! Könntet Ihr mir auch gleich schon die Lösung für mein Problem von morgen posten? Danke! ;-)
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
Antworten