python - 递归调用
我有一个用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]
不过,如果数据量很大,这样做会很快变得非常耗费资源,因为所有的数据都会同时保存在内存里。