python - рекурсивный вызов - PullRequest
1 голос
/ 07 июля 2010

У меня есть модель класса, разработанная для человека в классе Python. где человек является студентом и может иметь 0,1 или более советников. У человека также могут быть другие атрибуты, такие как имя, школа, год выпуска, классификация, в которой он работал, степень, которую он получил и т. д.

Я установил и получил методы для каждого из этих атрибутов в классе. Ex. set_advisor (self, advisor) добавляет консультанта в список консультантов студента. set_year (self, year) устанавливает год окончания студента.

аналогично get_advisor (self) возвращает советника студента. и так далее ..

наконец я заполняю объекты и называю их людьми.

если я хочу получить список студентов, окончивших школу через год, я просто пишу

print [people[p].name for p in people if people[p].year="YEAR"]

Теперь я хочу написать запрос, скажем ... перечислить студентов, которые закончили в каком-то году и чей советник проследил, чтобы сказать "abc" ... например, набор данных выглядит следующим образом ..

person a graduated in year 1990
person b graduated in year 1990
person c graduated in year 1991
person d graduated in year 1990
person a was advised by person e
person e was advised by person f
person f was advised by person g
person g was advised by person abc

person b was advised by person i
person i was advised by person abc

person c was advised by person abc

person d was advised by person h
person h was advised by person k

Теперь я хочу написать рекурсивный запрос, чтобы отслеживать только тех, кто закончил учебу в 1990 году и чей советник проследил до abc., в приведенном выше случае он должен дать мне только a и b в результате.

Как мне поступить об этом. У меня проблемы с синтаксисом и формулировкой запроса. Как и в тех же терминах, что и сформулированный выше запрос. Кто-нибудь может помочь в этом.

аналогично .. как мне написать запрос для ... скажем .. чтобы получить пары студентов, которые работали по некоторой классификации и окончили ее в том же году, а их консультанты также работали по той же классификации.

Спасибо.

1 Ответ

1 голос
/ 07 июля 2010

Вы можете написать метод в своем классе с чем-то вроде:

has_advisor(self, advisor):
    if not self.advisor:
        return False
    elif advisor in self.advisor:
        return True
    else
        return self.advisor.has_advisor(advisor)

Это позволит вам запрашивать такие вещи, как:

e = people['e']
e_in_advisor_tree_and_grad_in_1990 = [p for p in people if p.has_advisor(e) and p.year == 1990]

Это будет очень дорого очень быстро с большиминаборы данных, все из которых хранятся в памяти одновременно.

...