2010-07-06 5 views
1

J'ai un modèle de classe conçu pour une classe de personne en python. où une personne est un étudiant et peut avoir 0,1 ou plusieurs conseillers. Une personne peut également avoir d'autres attributs comme le nom, l'école, l'année d'obtention du diplôme, la classification sur laquelle il a travaillé, le diplôme qu'il a obtenu et ainsi de suite.python - appel récursif

J'ai défini et obtenu des méthodes pour chacun de ces attributs dans la classe. Ex. set_advisor (self, advisor) insère un conseiller à la liste des conseillers d'un étudiant. set_year (auto, année) définit l'année d'obtention du diplôme de l'étudiant.

De même get_advisor (auto) renvoie le conseiller de l'étudiant. et ainsi de suite ..

enfin je peuple les objets et les nomme comme personnes.

si je veux obtenir la liste des étudiants qui ont obtenu leur diplôme dans une année que je viens d'écrire

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

Maintenant, je veux écrire une requête, say..list les étudiants qui ont obtenu leur diplôme dans une année et dont le conseiller remonter à en dire « abc » ... par exemple ensemble de données se présente comme suit ..

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 

maintenant, je veux écrire une requête récursive pour suivre seulement ceux qui a obtenu son diplôme en 1990 et dont le conseiller remonter à abc Dans le cas ci-dessus, il ne devrait me donner que a et b comme résultat.

Comment procéder? J'ai des problèmes avec la syntaxe et la formulation de la requête. Comme dans les termes que j'ai formulés ci-dessus. Quelqu'un peut-il aider à ce sujet. De même, comment puis-je écrire une requête pour ... dire .. pour obtenir des paires d'étudiants qui ont travaillé sur une classification et ont obtenu leur diplôme dans la même année et ont eu leurs conseillers travaillant également sur la même classification.

Merci.

Répondre

1

Vous pouvez écrire une méthode sur votre classe avec quelque chose comme:

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

Cela vous permettrait interroger des choses comme:

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] 

Cela devenir très coûteux très rapidement avec de grands ensembles de données, tous les dont sont conservés en mémoire en même temps.

+0

Dans ce cas, self.advisor est susceptible d'être une liste de chaînes, donc le .has_advisor récursif ne fonctionnera probablement pas, non? –

+0

semble prometteur. J'essaierais dès que je reviendrai et mettre à jour. – Anu

+0

@Blair - dépend. Si self.advisor est une liste de chaînes, alors nous pourrions substituer 'people [adv_name] pour adv_name dans advisors' – Benj