Генеалогическое древо в Python

Мне нужно смоделировать генеалогическое древо из четырех поколений, начиная с пары. После этого, если я ввожу имя человека и отношение, такое как «брат», «сестра» или «родитель», мой код должен выводить братьев, сестер или родителей человека. Я неплохо разбираюсь в python и самоучка в DSA. Я думаю, что мне следует смоделировать данные как словарь и код для дерева DS с двумя корневыми узлами (т.е. первой парой). Но я не уверен, как начать. Мне просто нужно знать, как начать моделирование генеалогического древа и направление, как перейти к коду. Заранее спасибо!


person Lax_Sam    schedule 06.11.2018    source источник


Ответы (1)


Есть много способов содрать шкуру с кошки, но я предлагаю создать:

  1. Класс Person, который содержит соответствующие данные о человеке (пол) и данные о прямых отношениях (родители, супруг(а), дети).
  2. Словарь сопоставляет имена с Person элементами.

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

person Henning Koehler    schedule 06.11.2018
comment
После создания класса, как я могу сохранить данные в словаре? Я имею в виду, как сопоставить имена с элементами класса? - person Lax_Sam; 15.11.2018
comment
Не уверен, что понял вопрос - familyTree['Hans'] = Person(...) добавит отображение имени 'Hans' в Person(...) в словарь familyTree. docs.python.org/3.7/tutorial/datastructures.html#dictionaries - person Henning Koehler; 16.11.2018
comment
Это связано с вашим ответом, но не совсем то же самое. Я хотел знать, могу ли я создать вложенный словарь и как распечатать содержимое. Например: {'Ганс': {'имя': 'Люси', 'родство': 'жена''}}. Итак, класс Person принимает два аргумента: имя и отношение, и мне нужно его распечатать. - person Lax_Sam; 16.11.2018
comment
Создайте для этого методы __init__ (конструктор) и __repr__ (строковое представление), см. stackoverflow.com/questions/1984162/цель-оф-питонов-репр. - person Henning Koehler; 17.11.2018