Un avant-goût des bases de données en Python

Une petite activité sur les définitions d'ensembles par compréhension et les filtres en Python qui donne un avant-goût des requêtes SQL en BD (Le fichier source ) :

Python
##   E N S E M B L E S   P A R   C O M P R É H E N S I O N   
##    E T   T A B L E A U X   D E     D O N N É E S  
 
 
    # On vous demande de gérer le centre d'acceuil terrestre des aliens. 
    # Vous disposez de 6 tableaux de données.
    # Vous devez fournir les expressions qui permettent de répondre aux 
    # questions posées au bas de cette page.
    # Par exemple, pour avoir la liste des aliments :
    
    # In [50]: { m.aliment for m in baseMiam }
    # Out[50]: {'Bortsch', 'Kashpir', 'Schwanstucke', 'Zoumise'}
 
    # La liste des aliments mangés par les Aliens de Trantor :
 
    # lesAlimTrantor = { m.aliment
    #                for m in baseMiam
    #                for a in baseAlien
    #                if m.nom_alien == a.nom
    #                if a.planete == "Trantor" }
    
    # In [54]: lesAlimTrantor
    # Out[56]: {'Bortsch', 'Schwanstucke'}
 
 
class Alien:
    def __init__(self, Nom, Sexe, Planete, NoCabine):
        "Constructeur d'Aliens"
        self.nom       = Nom
        self.sexe      = Sexe
        self.planete   = Planete
        self.no_cabine = NoCabine
 
class Cabine:
    def __init__(self,NoCabine, NoAllee):
        "Constructeur de Cabine"
        self.no_allee  = NoAllee
        self.no_cabine = NoCabine
 
class Miam:
    def __init__(self, NomAlien, Aliment):
        "Constructeur d'Aliments"
        self.nom_alien  = NomAlien
        self.aliment    = Aliment
 
class Agent:
    def __init__(self, Nom, Ville):
        "Constructeur d'Agents"
        self.nom   = Nom
        self.ville = Ville
 
class Responsable:
    def __init__(self, NoAllee, Nom):
        "Constructeur de Responsables"
        self.no_allee = NoAllee
        self.nom      = Nom
 
class Gardien:
    def __init__(self, Nom, NoCabine):
        "Constructeur de Gardiens"
        self.nom       = Nom
        self.no_cabine = NoCabine
 
 
        
 
baseAlien =  {
  Alien ( "Zorglub",    "M", "Trantor", 1 ),
  Alien ( "Blorx",      "M", "Euterpe", 2 ),
  Alien ( "Urxiz",      "F", "Aurora",  3 ),
  Alien ( "ZBleurdite", "F", "Trantor", 4 ),
  Alien ( "Darneurane","M", "Trantor", 5 ),
  Alien ( "Mulzo",      "M", "Helicon", 6 ),
  Alien ( "Zzzzz",      "F", "Aurora",  7 ),
  Alien ( "Arggh",      "M", "Nexon",   8 ),
  Alien ( "Joranum",    "F", "Euterpe", 9 )
  }
            
baseCabine =  {
  Cabine ( 1 ,  1),
  Cabine ( 2 ,  1),
  Cabine ( 3 ,  1),
  Cabine ( 4 ,  1),
  Cabine ( 5 ,  1),
  Cabine ( 6 ,  2),
  Cabine ( 7 ,  2),
  Cabine ( 8 ,  2),
  Cabine ( 9 ,  2)
  }
             
baseMiam =  {
  Miam ( "Zorglub",    "Bortsch"),
  Miam ( "Blorx",      "Bortsch"),
  Miam ( "Urxiz",      "Zoumise"),
  Miam ( "ZBleurdite", "Bortsch"),
  Miam ( "Darneurane", "Schwanstucke"),
  Miam ( "Mulzo",      "Kashpir"),
  Miam ( "Zzzzz",      "Kashpir"),
  Miam ( "Arggh",      "Zoumise"),
  Miam ( "Joranum",    "Bortsch")
  }
           
baseAgent =  {
  Agent ( "Branno",   "Terminus"), 
  Agent ( "Darell",   "Terminus"), 
  Agent ( "Demerzel", "Reze"), 
  Agent ( "Seldon",   "Terminus"), 
  Agent ( "Dornick",  "Kalgan"), 
  Agent ( "Hardin",   "Terminus"), 
  Agent ( "Trevize",  "Hesperos"), 
  Agent ( "Pelorat",  "Kalgan"), 
  Agent ( "Riose",    "Terminus")
  }
        
baseResponsable =  {
  Responsable ( 1, "Seldon"),
  Responsable ( 2, "Pelorat")
  }
                  
 
baseGardien =  {
  Gardien ( "Branno",   1), 
  Gardien ( "Darell",   2), 
  Gardien ( "Demerzel", 3), 
  Gardien ( "Seldon",   4), 
  Gardien ( "Dornick",  5), 
  Gardien ( "Hardin",   6), 
  Gardien ( "Trevize",  7), 
  Gardien ( "Pelorat",  8), 
  Gardien ( "Riose",    9)
  }
 
 
# Formez 
 
# -1 l'ensemble des gardiens ;
# -2 l'ensemble des villes où habitent les agents ;
# -3 l'ensemble des triplets (no de cabine,alien,gardien) pour chaque cabine ;
# -4 l'ensemble des couples (alien,allée) pour chaque alien ;
# -5 l'ensemble de tous les aliens de l'allée 2 ;
# -6 l'ensemble de toutes les planètes dont sont originaires les aliens habitant une cellule de numéro pair ;
# -7 l'ensemble des aliens dont les gardiens sont originaires de Terminus ;
# -8 l'ensemble des gardiens des aliens féminins qui mangent du bortsch ;
# -9 l'ensemble des cabines dont les gardiens sont originaires de Terminus ou dont les aliens sont des filles
 
# Y a-t-il 
# -10 des aliments qui commencent par la même lettre que le nom du gardien qui surveille l'alien qui les mange ? 
# -11 des aliens originaires d'Euterpe ?
 
# Est-ce que 
# -12 tous les aliens ont un 'x' dans leur nom ?
# -13 tous les aliens qui ont un 'x' dans leur nom ont un gardien qui vient de Terminus ?
# -14 il existe un alien masculin originaire de Trantor qui mange du Bortsch ou dont le gardien vient de Terminus

JOKER :

Python
# Formez 
 
# -1 l'ensemble des gardiens ;
gardiens = { gardien.nom for gardien in baseGardien }
# -2 l'ensemble des villes où habitent les agents ;
villes = { agent.ville for agent in baseAgent }
# -3 l'ensemble des triplets (no de cabine,alien,gardien) pour chaque cabine ;
triples = { (alien.no_cabine, alien.nom, gardien.nom)
            for alien in baseAlien
            for gardien in baseGardien if gardien.no_cabine == alien.no_cabine}
# -4 l'ensemble des couples (alien,allée) pour chaque alien ;
# -5 l'ensemble de tous les aliens de l'allée 2 ;
# -6 l'ensemble de toutes les planètes dont sont originaires les aliens habitant une cellule de numéro pair ;
# -7 l'ensemble des aliens dont les gardiens sont originaires de Terminus ;
# -8 l'ensemble des gardiens des aliens féminins qui mangent du bortsch ;
# -9 l'ensemble des cabines dont les gardiens sont originaires de Terminus ou dont les aliens sont des filles
 
 
# Y a-t-il 
# -10 des aliments qui commencent par la même lettre que le nom du gardien qui surveille l'alien qui les mange ?
test10 = True in { miam.aliment[0] == gardien.nom[0]
                   for miam in baseMiam
                   for alien in baseAlien
                   for gardien in baseGardien
                   if gardien.no_cabine == alien.no_cabine and alien.nom == miam.nom_alien }
# -11 des aliens originaires d'Euterpe ?
 
# Est-ce que 
# -12 tous les aliens ont un 'x' dans leur nom ?
# -13 tous les aliens qui ont un 'x' dans leur nom ont un gardien qui vient de Terminus ?
test13 = False not in { agent.ville == 'Terminus' and 'x' in alien.nom
                        for alien in baseAlien
                        for gardien in baseGardien
                        for agent in baseAgent
                        if gardien.no_cabine == alien.no_cabine and gardien.nom == agent.nom }
# -14 il existe un alien masculin originaire de Trantor qui mange du Bortsch ou dont le gardien vient de Terminus