python - 递归调用

1 投票
1 回答
511 浏览
提问于 2025-04-16 00:54

我有一个用Python写的人类模型,专门用来表示学生。每个学生可以有0个、1个或多个导师。学生还可以有其他属性,比如名字、学校、毕业年份、研究的分类、获得的学位等等。

在这个类里,我为每个属性都设置了获取和设置的方法。比如,set_advisor(self, advisor)这个方法可以把导师添加到学生的导师列表里。set_year(self, year)这个方法则用来设置学生的毕业年份。

同样,get_advisor(self)这个方法可以返回学生的导师,其他的方法也是类似的。

最后,我创建了一些对象,并把它们命名为people。

如果我想获取某一年毕业的学生列表,我只需要写

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

你可以在你的类里写一个方法,像这样:

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]

不过,如果数据量很大,这样做会很快变得非常耗费资源,因为所有的数据都会同时保存在内存里。

撰写回答