rekursiv familietre med objekter

stemmer
0

Hei folkens Jeg trenger hjelp med rekursiv representasjon av slektstreet, her er data:

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

Jeg trenger å nevne at verdiene er objekter, så jeg må ringe dem children_and_parents [ Maria] barn -. for å få [ 'Patricia', 'Lisa']

den rekursive programmet jeg har for tiden

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) 

hva det gjør for tiden er

Mary
   Patricia
      Barbara

men resultatet bør være noe som

Mary
   Patricia
       Barbara
           Betty
       Helen
       Maria
           Keren
           Carol
   Lisa

så jeg har fått ble sittende fast helt på tigge av programmet, hvis noen ville være villig til å hjelpe ville jeg virkelig pris på det

grov kode https://repl.it/repls/BlondCavernousExponents

Publisert på 27/11/2018 klokken 17:53
kilden bruker
På andre språk...                            


1 svar

stemmer
2

Finne roten av treet er en god kandidat for en egen operasjon. I ditt eksempel, vet vi at det er "Mary", slik at vi kan gjenta deretter. Hvis vi ikke vet (og det er utrygt å anta at det første elementet i dict er roten), kan du skrive:

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

Som for selve utskriftsprosedyren, kan du prøve å skrive ut foreldrenoden før gjentar løpet barn. Jeg anbefaler også passerer treet som en parameter til funksjonen for å hindre innkapsling og holde den gjenbrukbare (dvs. ikke avhengig av noen variabel kalt children_and_parentseksisterende i ringer omfang.

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)

Produksjon:

Mary
   Patricia
      Barbara
         Betty
      Helen
      Maria
         Keren
         Carol
   Lisa

Prøv det!

Som nevnt i en tidligere diskusjon, jeg anbefaler ikke å bruke en klasse for en enkel <string, list>par; det gir mye detaljnivå uten funksjonalitet og er faktisk litt misvisende, fordi parentvilledende antyder at personen har en forelder (det er faktisk henviser til navnet på personen representert ved objektet). Hvis du velger å gå denne ruten, må du legge .childtil alle de array-tilganger og skrive en __repr__(self)funksjon for klassen (eller print(root.parent).

Svarte 27/11/2018 kl. 18:06
kilden bruker

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