2016-05-16 21 views
0

Ich lerne über das Erstellen von Liste von Listen durch Entwerfen eines Stammbaums. Unten ist eine Möglichkeit, dies zu tun, aber ich habe Probleme beim Drucken des Ergebnisses. Zum Beispiel:Drucken einer Liste von Listen

wenn A 2 Kinder, B & C ... dann hat B 2 Kinder, D & E ... während C nur auf Kind, F ...

würde ich möchte, dass das Ergebnis gedruckt wird: [A, [B, [D, E]], [C, [F]]]

Ich würde mich über Verbesserungen in meinem Code, Ratschläge, wie das Ergebnis wie oben gedruckt wird, freuen Drucken Sie es in einer grafischen Form aus.

class FamilyTree: 
    def __init__(self, root): 
     self.name = [root] 
     nmbr = int(input("How many children does " + root + " have?")) 
     if nmbr is not 0: 
      for i, child in enumerate(range(nmbr)): 
       name = input("What is one of " + root + "'s child's name?") 
       setattr(self, "child{0}".format(i), FamilyTree(name)) 
r = print(FamilyTree('A')) 
+0

Sie einen Baum drucken können nicht während Sie bauen es ... (es sei denn, Sie bauen es in Ordnung). – alfasin

+0

Zugehörig: [Drucken einer Baumdatenstruktur in Python] (http://stackoverflow.com/questions/20242479/printing-a-tree-data-structure-in-python) – DaoWen

Antwort

0

Sie könnten die __str__ Methode verwenden, die durch print() Funktion aufgerufen wird:

class FamilyTree: 
    def __init__(self, root): 
     self.name = root 
     self.children = [] 
     nmbr = int(input("How many children does " + root + " have? ")) 
     if nmbr is not 0: 
      for i, child in enumerate(range(nmbr)): 
       name = input("What is one of " + root + "'s child's name? ") 
       self.children.append(FamilyTree(name)) 
    def __str__(self): 
     return '[' + self.name + ''.join(', ' + str(c) for c in self.children) + ']' 
r = print(FamilyTree('A')) 
0

Es ist eine gute Idee, spaltete die Objekterstellung aus dem Ein- und Ausgang. Wenn Sie setattr verwenden, wird es schwieriger, die Ausgabe zu schreiben.

Hier ist eine Lösung, die Sie aus dem Benutzer eine FamilyTree mit oder ohne Eingabe lesen erstellen können:

class FamilyTree: 
    def __init__(self, root, childs = []): 
     self.name = root 
     self.childs = childs 

    def read(self): 
     nmbr = int(input("How many children does " + self.name + " have? ")) 
     if nmbr is not 0: 
      for _ in range(nmbr): 
       name = input("What is one of " + self.name + "'s child's name? ") 
       child = FamilyTree(name) 
       child.read() 
       self.childs.append(child) 

    def __repr__(self): 
     if len(self.childs) == 0: 
      return str("{}".format(self.name)) 
     else: 
      return str("{}, {}".format(self.name, self.childs)) 

# creates a FamilyTree directly so we can test the output 
r = FamilyTree(
     'A', 
     [ 
      FamilyTree(
       'B', 
       [FamilyTree('C'), FamilyTree('C')] 
      ), 
      FamilyTree(
       'C', 
       [FamilyTree('F')] 
      ) 
     ] 
    ) 

# or read input from the user 
# r = FamilyTree('A') 
# r.read() 

print(r) 

Ausgabe

A, [B, [C, C], C, [F]] 
Verwandte Themen