Aller au contenu

Sélection de lignes

A partir d'une table initiale, on cherche à créer une nouvelle table par extraction des lignes qui satisfont une condition donnée.

Exemple

A partir d'une table de données contenant des informations sur des individus, on souhaite obtenir :

  • la table de tous les individus qui sont nés avant 2000 ;
  • ou bien la table de tous les individus qui se prénomment "Alain" et qui sont nées après 1990 ;
  • etc...

Principe

  1. On initialise une table vide.
  2. Pour chaque ligne de la table étudiée, on identifie la valeur correspondant à un (ou plusieurs) attribut(s) choisi(s).
  3. Si cette valeur est celle recherchée, on copie la ligne dans la nouvelle table.
  4. Enfin, on renvoie le contenu de la nouvelle table.

Sélection par compréhension

Puisque les tables sont représentées par un tableau de dictionnaires en Python, une définition par compréhension de tableau permet d'effectuer cette sélection :

1
new_table = [dico for dico in table if dico[attribut] == valeur]

Il faut être très attentif au type des valeurs prises par les attributs.
En particulier, bien convertir en entier (ou en flottant) les valeurs des attributs qui le nécessitent avant d'effectuer ces opérations de sélection...

Rappel

Le module fonctions_csv.py contient les fonctions attributs_entiers() et attributs_flottants() qui permettent d'effectuer, par effet de bord ces conversions sur les attributs désignés de la table.

Exemples

On se réfère à nouveau à la table Personnes suivante :

num nom prenom genre annee_nais
1 Labrosse Adam M 2000
2 Gemlamorte Adèle F 1985
3 Auboisdormant Abel M 2001
4 Etpan Ahmed M 1975
5 Térieur Alain M 1999
  1. Ouvrez un éditeur Python puis copiez/collez la table de données suivante :

    1
    2
    3
    4
    5
    personnes = [{'id_personne': 1, 'nom': 'Labrosse', 'prenom': 'Adam', 'genre': 'M', 'annee_nais': 2000},
                 {'id_personne': 2, 'nom': 'Gemlamorte', 'prenom': 'Adèle', 'genre': 'F', 'annee_nais': 1985},
                 {'id_personne': 3, 'nom': 'Auboisdormant', 'prenom': 'Abel', 'genre': 'M', 'annee_nais': 2001},
                 {'id_personne': 4, 'nom': 'Etpan', 'prenom': 'Ahmed', 'genre': 'M', 'annee_nais': 1975},
                 {'id_personne': 5, 'nom': 'Térieur', 'prenom': 'Alain', 'genre': 'M', 'annee_nais': 1999}]
    

  2. On veut extraire la table de toutes les personnes étant des hommes.
    Copiez, collez et complétez en ligne 7 la définition par compréhension du tableau hommes pour qu'il contienne les données correspondantes.

    7
    hommes = [... for ... in ... if ...]
    

    Tests dans la console

    Vérifiez que vous obtenez les résultats suivants lors de l'appel dans la console :

    >>> hommes
    [{'id_personne': 1, 'nom': 'Labrosse', 'prenom': 'Adam', 'genre': 'M', 'annee_nais': 2000},
     {'id_personne': 3, 'nom': 'Auboisdormant', 'prenom': 'Abel', 'genre': 'M', 'annee_nais': 2001},
     {'id_personne': 4, 'nom': 'Etpan', 'prenom': 'Ahmed', 'genre': 'M', 'annee_nais': 1975},
     {'id_personne': 5, 'nom': 'Térieur', 'prenom': 'Alain', 'genre': 'M', 'annee_nais': 1999}]
    

    Une solution
    1
    2
    3
    4
    5
    6
    7
    personnes = [{'id_personne': 1, 'nom': 'Labrosse', 'prenom': 'Adam', 'genre': 'M', 'annee_nais': 2000},
                 {'id_personne': 2, 'nom': 'Gemlamorte', 'prenom': 'Adèle', 'genre': 'F', 'annee_nais': 1985},
                 {'id_personne': 3, 'nom': 'Auboisdormant', 'prenom': 'Abel', 'genre': 'M', 'annee_nais': 2001},
                 {'id_personne': 4, 'nom': 'Etpan', 'prenom': 'Ahmed', 'genre': 'M', 'annee_nais': 1975},
                 {'id_personne': 5, 'nom': 'Térieur', 'prenom': 'Alain', 'genre': 'M', 'annee_nais': 1999}]
    
    hommes = [dico for dico in personnes if dico['genre']=='M']
    
  3. On veut extraire la table de toutes les personnes dont l'année de naissance est supérieure ou égale à 2000.
    Copiez, collez et complétez en ligne 9 la définition par compréhension du tableau generation_Z pour qu'il contienne les données correspondantes.

    9
    generation_Z = [... for ... in ... if ...]
    

    Tests dans la console

    Vérifiez que vous obtenez les résultats suivants lors de l'appel dans la console :

    >>> generation_Z
    [{'id_personne': 1, 'nom': 'Labrosse', 'prenom': 'Adam', 'genre': 'M', 'annee_nais': 2000},
     {'id_personne': 3, 'nom': 'Auboisdormant', 'prenom': 'Abel', 'genre': 'M', 'annee_nais': 2001}]
    

    Une solution
    1
    2
    3
    4
    5
    6
    7
    8
    9
    personnes = [{'id_personne': 1, 'nom': 'Labrosse', 'prenom': 'Adam', 'genre': 'M', 'annee_nais': 2000},
                 {'id_personne': 2, 'nom': 'Gemlamorte', 'prenom': 'Adèle', 'genre': 'F', 'annee_nais': 1985},
                 {'id_personne': 3, 'nom': 'Auboisdormant', 'prenom': 'Abel', 'genre': 'M', 'annee_nais': 2001},
                 {'id_personne': 4, 'nom': 'Etpan', 'prenom': 'Ahmed', 'genre': 'M', 'annee_nais': 1975},
                 {'id_personne': 5, 'nom': 'Térieur', 'prenom': 'Alain', 'genre': 'M', 'annee_nais': 1999}]
    
    hommes = [dico for dico in personnes if dico['genre']=='M']
    
    generation_Z = [dico for dico in personnes if dico['annee_nais']>=2000]