Rekursion über verschachtelten Objekt-Baum

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.
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

Rekursion über verschachtelten Objekt-Baum

Beitragvon N317V » Dienstag 25. Juli 2006, 14:51

Greetings!

Ich hab hier einen verschachtelten Baum von Themen und Unterthemen. Natürlich kann jedes Thema auch mehrere Unterthemen beinhalten. Ich möchte eine Funktion, die mir für jedes Thema ein verschachteltes Dictionary mit der gesamten Themenhierarchie zurückgibt. Das ganze stell ich mir ungefähr so vor:

Code: Alles auswählen

>>> n = topic('Nahrung')
>>> n.addSubtopic('Essen')
>>> n.addSubtopic('Trinken')
>>> n.subtopics['Essen'].addSubtopic('Proteine')
>>> n.getTopicTree()
{'Nahrung': {'Essen': {'Proteine': {}}, 'Trinken': {}}}


Meine Lösung ist folgende rekursive Funktion:

Code: Alles auswählen

    def getTopicTree(self, root=True):       
        subs = {}
        for i in self.subtopics.keys():
            subs[i] = self.subtopics[i].getTopicTree(False)
        if root:# Only in the initial call of the recursion, we add another 'root'-Level
            subs = {self.name:subs}
        return subs


Irgendwie kommt mir das ganze aber holprig und unelegant vor. Da jetzt ein ähnliches Problem vor mir liegt (Links- und Rechtswerte für jedes topic, sprich: die ganze Hierarchie als Nested Set), frag ich mich, ob das ganze nicht auch eleganter geht, bevor ich's wieder auf ähnliche Art und Weise zusammenschuster. Aber irgendwie blockiert die Hitze mein Denkvermögen. Kann mir mal irgendwer Luft zufächeln oder zumindest gedanklich auf die Sprünge helfen? :-)

P.S.: JFTR, ich beschwer mich keineswegs über das geile Wetter, nur arbeiten müsst halt jetzt nicht unbedingt sein.
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
Benutzeravatar
Michael Schneider
User
Beiträge: 566
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Beitragvon Michael Schneider » Montag 31. Juli 2006, 23:05

Hi,

die grausame Hitze (zumindest auf der Arbeit) scheint langsam abzunehmen, da habe ich mir gedacht, versuch Dein Glück:

Code: Alles auswählen

class topic:
    def __init__(self, name):
        self.name = name
        self.subtopics = {}

    def addSubtopic(self, name):
        self.subtopics[name] = topic(name)

    def __repr__(self):
        return "<topic:" + self.name + ">"
       
    def getSubTopicTree(self):
        subtopics = self.subtopics.copy()
        for stK, stV in subtopics.items():
            subtopics[stK] = stV.getSubTopicTree()
        return subtopics

    def getTopicTree(self):
        return {self.name:self.getSubTopicTree()}

n = topic('Nahrung')
n.addSubtopic('Essen')
n.addSubtopic('Trinken')
n.subtopics['Essen'].addSubtopic('Proteine')
print n.getTopicTree()


Dass es nun "eleganter" ist, kann ich nicht gerade behaupten. :roll:
Für meine Lösung habe ich einfach eine Kopie des schon existierenden Dictionaries der Nodes benutzt, dessen Werte ich durch das Dictionary seiner Kinderknoten ersetzte. Ist wirklich nicht viel schöner - aber anders. :-) Sorry.

Grüße,
der Michel
Diese Nachricht zersört sich in 5 Sekunden selbst ...
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

Beitragvon N317V » Dienstag 1. August 2006, 08:53

Doch, ich find's schon schöner, wenn auch nur im Detail. Zumindest spart man sich den Schmarrn mit dem root-Flag. Danke schön!

Michael Schneider hat geschrieben:

Code: Alles auswählen

return {self.name:self.getSubTopicTree()}



Diese Notation mit dem Doppelpunkt kannte ich noch gar nicht.
Es gibt für alles eine rationale Erklärung.
Außerdem gibt es eine irrationale.

Wie man Fragen richtig stellt
Benutzeravatar
Michael Schneider
User
Beiträge: 566
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Beitragvon Michael Schneider » Dienstag 1. August 2006, 19:56

N317V hat geschrieben:

Code: Alles auswählen

return {self.name:self.getSubTopicTree()}


Diese Notation mit dem Doppelpunkt kannte ich noch gar nicht.


Verzeih, aber hast Du sie nicht in Zeile 6 Deines zweiten Codesegments verwendet? :wink:

Grüße,
Michael
Diese Nachricht zersört sich in 5 Sekunden selbst ...
N317V
User
Beiträge: 504
Registriert: Freitag 8. April 2005, 13:23
Wohnort: München

Beitragvon N317V » Mittwoch 2. August 2006, 08:52

Michael Schneider hat geschrieben:Verzeih, aber hast Du sie nicht in Zeile 6 Deines zweiten Codesegments verwendet? :wink:


Ich sag nur:
Verfasst am: Di Aug 01, 2006 08:53

Eindeutig Pre-Coffee! :lol:
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: 0 Mitglieder