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

Rekursives Vorhandensein eines Wertes

Beitragvon droptix » Dienstag 24. Januar 2006, 00:08

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:

Beitragvon modelnine » Dienstag 24. Januar 2006, 00:15

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

Der Stern (*) is voll geil!

Beitragvon droptix » Dienstag 24. Januar 2006, 09:56

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

Re: Der Stern (*) is voll geil!

Beitragvon N317V » Donnerstag 26. Januar 2006, 16:13

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

Wer ist online?

Mitglieder in diesem Forum: brainstir