Seite 1 von 1

Rekursives Vorhandensein eines Wertes

Verfasst: Dienstag 24. Januar 2006, 00:08
von droptix
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"

Verfasst: Dienstag 24. Januar 2006, 00:15
von modelnine
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.

Der Stern (*) is voll geil!

Verfasst: Dienstag 24. Januar 2006, 09:56
von droptix
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!

Re: Der Stern (*) is voll geil!

Verfasst: Donnerstag 26. Januar 2006, 16:13
von N317V
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! ;-)