2014-11-11 5 views
2

Я реализую класс «человек» с именами аргументов, заголовками и дочерними элементами. Функция «desc» должна возвращать список лиц, находящихся под генеалогическим деревом.Python: Семейный класс

До сих пор я сделал это:

class Person(): 
    def __init__(self, name, title, children=None): 
     self.name = name 
     self.title = title 
     if children is None: 
      self.children = [] 
     else: 
      self.children = children 


    def desc(self): 
     self.out = [] 
     if self.children: 
      for kid in self.children: 
       self.out.append(kid) 
      return self.out 


p1 = Person("p1", "test") 
p2 = Person("p2", "test", children = [p1]) 
p3 = Person("p3", "test") 
p4 = Person("p4", "test", children = [p2, p3]) 
p5 = Person("p5", "boss", children = [p4]) 
print [person.title for person in p5.desc()] 
# desired output: 
# ['test', 'test', 'test','test'] 
print [person.name for person in p5.desc()] 
# desired output: 
# ['p4', 'p2', 'p1', 'p3'] 

Но мой фактический выход не выглядит как желаемому. Итак, мой вопрос: как бы вы спасли детей? В простом списке? Проблема явно в def desc(). Спасибо за любую помощь!

+1

ли эта работа? Не следует ли «george» и все имена быть строками? – Maroun

ответ

2

Вам придется рекурсивный над children списков:

def desc(self): 
    out = [] 
    for kid in self.children: 
     out.append(kid) 
     out.extend(kid.desc()) 
    return out 

При этом используется метод desc() текущего объекта, а затем вызывает тот же метод по каждому из перечисленных ребенка продлить текущий список результатов. Это продолжается до тех пор, пока не будут обнаружены объекты без детей.

Отметьте, что out не обязательно должен быть атрибутом экземпляра; Вместо этого я сохранил локальную переменную.

Это производит ваш ожидаемый результат:

>>> class Person(): 
...  def __init__(self, name, title, children=None): 
...   self.name = name 
...   self.title = title 
...   if children is None: 
...    self.children = [] 
...   else: 
...    self.children = children 
...  def desc(self): 
...   out = [] 
...   for kid in self.children: 
...    out.append(kid) 
...    out.extend(kid.desc()) 
...   return out 
... 
>>> p1 = Person("p1", "test") 
>>> p2 = Person("p2", "test", children = [p1]) 
>>> p3 = Person("p3", "test") 
>>> p4 = Person("p4", "test", children = [p2, p3]) 
>>> p5 = Person("p5", "boss", children = [p4]) 
>>> print [person.title for person in p5.desc()] 
['test', 'test', 'test', 'test'] 
>>> print [person.name for person in p5.desc()] 
['p4', 'p2', 'p1', 'p3'] 

Так p5.desc() добавляет p4 к out списка, а затем расширяет список с результатом p4.desc(). p4.desc() добавляет p2 в это локальный out список, расширяет его с результатом p2.desc(), а затем добавляет к p3out и расширяет его с p3.desc() и т.д.

+0

Вау, большое спасибо. Это именно то, что я хотел! :) – DMan

Смежные вопросы