rekursive Stammbaum mit Objekten

stimmen
0

Hallo Jungs, die ich mit rekursiven Darstellung Stammbaum Hilfe benötigen, ist hier die Daten:

children_and_parents = {
Mary: [Patricia, Lisa], 
Patricia: [Barbara, Helen, Maria], 
Maria: [Keren, Carol], 
Barbara: [Betty]
}

Ich muss erwähnen, dass die Werte Objekte sind, so brauche ich sie children_and_parents nennen [ „Maria“] Kind -. erhalten [ ‚Patricia‘, ‚Lisa‘]

das rekursive Programm, das ich zur Zeit habe

def draw_family_tree(person, level=0):
if person in children_and_parents:
    for i in range (len(children_and_parents[person].child)):
        print ( *level, person)
        return draw_family_tree(children_and_parents[person].child[i], level+3) 

was seine derzeit tun ist

Mary
   Patricia
      Barbara

aber das Ergebnis sollte etwas sein, wie

Mary
   Patricia
       Barbara
           Betty
       Helen
       Maria
           Keren
           Carol
   Lisa

so ich habe die ganz am Bitten des Programms steckte geblieben, wenn jemand bereit wäre, zu helfen, würde ich es wirklich schätzen

rough Code https://repl.it/repls/BlondCavernousExponents

Veröffentlicht am 27/11/2018 um 17:53
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
2

Das Finden der Wurzel des Baumes ist ein guter Kandidat für einen separaten Betrieb. In Ihrem Beispiel wissen wir , es ist "Mary", so können wir entsprechend wiederholen. Wenn wir nicht wissen (und es ist nicht sicher davon ausgehen , dass das erste Element in der dict ist die Wurzel), können Sie schreiben:

def find_root(tree):
    children = set([x for y in tree.values() for x in y])

    for k in tree.keys():
        if k not in children:
            return k

Wie für den eigentlichen Druckvorgang, versuchen , den Knoten Mutterdruck , bevor sie über Kinder laufen. Ich empfehle auch , den Baum als Parameter an die Funktion Verkapselung zu halten und halten sie wiederverwendbar (dh nicht abhängig von irgendeiner Variable namens children_and_parentsbestehenden in dem rufenden Umfang.

def draw_family_tree(tree, root, level=0, gap=3):
    if root:
        print(" " * level + root)

        if root in tree:
            for child in tree[root]:
                draw_family_tree(tree, child, level + gap)

Ausgabe:

Mary
   Patricia
      Barbara
         Betty
      Helen
      Maria
         Keren
         Carol
   Lisa

Versuch es!

Wie in einer früheren Diskussion erwähnt, empfehle ich nicht eine Klasse für ein einfaches Verwendung <string, list>Paar; es fügt eine Menge von Ausführlichkeit ohne Funktionalität und ist eigentlich ein wenig irreführend, weil parentmisleadingly die Person schlägt einen Elternteil hat (es wird Bezug tatsächlich auf den Namen der Person , durch das Objekt dargestellt). Wenn Sie diesen Weg gehen Sie wählen, müssen Sie anhängen , .childum alle Feldzugriffe und schreiben Sie eine __repr__(self)Funktion für Ihre Klasse (oder print(root.parent).

Beantwortet am 27/11/2018 um 18:06
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more