Aller au contenu

Recherche de donnée simple

On expose dans cette page les principes généraux d’une telle recherche. Pour illustrer ces principes, on se référera à 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

Cette table correspond au tableau de dictionnaires suivant :

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}]

Rechercher si une valeur est présente

Principe

  1. On parcourt l'ensemble des lignes de la table de données.
  2. Pour chaque ligne, on identifie la valeur correspondant à l'attribut choisi.
  3. Ou bien cette valeur est celle recherchée et on renvoie True,
  4. Ou bien ce n'est pas le cas et on examine la ligne suivante.
  5. Si on ne trouve pas non plus à la dernière ligne, on renvoie False

Exemple

Copiez, collez et complétez la définition de la fonction est_presente() qui renvoie True si, dans la table, une des valeurs de l'attribut attribut est valeur.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
def est_presente(table, attribut, valeur):
    """
    table - list, Table de données représentée par un tableau de dictionnaires ayant les mêmes clés
    attribut - str, chaîne de caractères représentant une des clés
    valeur - doit être du même type que les valeurs de la clé attribut
    Sortie: booléen - True si valeur est présente dans la ligne pour l'attribut sélectionné, False sinon
    """
    for dico in table:
        if ..... :
            return .....
    return .....

##----- Programme principal et Tests -----##
if __name__ == '__main__':
    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}]

Tests dans la console

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

>>> est_presente(personnes, 'annee_nais', 1985)
True

>>> est_presente(personnes, 'annee_nais', 1977)
False

Une solution
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
def est_presente(table, attribut, valeur):
    """
    table - list, Table de données représentée par un tableau de dictionnaires ayant les mêmes clés
    attribut - str, chaîne de caractères représentant une des clés
    valeur - doit être du même type que les valeurs de la clé attribut
    Sortie: booléen - True si valeur est présente dans la ligne pour l'attribut sélectionné, False sinon
    """
    for dico in table:
        if dico[attribut] == valeur:
            return True
    return False
Remarque importante

La fonction est_presente() est déjà définie dans le module fonctions_csv.py.
Par conséquent, il n'est pas nécessaire de la copier/coller d'un programme à l'autre : il suffira d'importer le module fonctions_csv pour pouvoir utiliser cette fonction.

Récupérer une donnée simple

Principe

  1. On parcourt l'ensemble des lignes de la table de données.
  2. Pour chaque ligne, on identifie la valeur correspondant à l'attribut choisi.
  3. Si cette valeur est celle recherchée, on renvoie la valeur d'un autre attribut de cette ligne,
  4. ou bien ce n'est pas le cas et on examine la ligne suivante.
  5. Si on ne trouve pas non plus à la dernière ligne, on renvoie None

Exemple

Copiez, collez et complétez la définition de la fonction recupere_valeur() qui renvoie la valeur de attribut2 présent dans une ligne de table si, dans cette ligne, la valeur de l'attribut attribut1 est valeur1.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
def recupere_valeur(table, attribut1, valeur1, attribut2):
    """
    table - list, Table de données représentée par un tableau de dictionnaires ayant les mêmes clés
    attribut1, attribut2 - str, chaînes de caractères représentant une des clés
    valeur1 - doit être du même type que les valeurs de la clé attribut1
    Sortie: la valeur de la clé attribut2 de cette ligne,
            None si attribut1 ne prend jamais la valeur valeur1
    """
    for dico in table:
        if ..... :
            return .....
    return .....

##----- Programme principal et Tests -----##
if __name__ == '__main__':
    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}]

Tests dans la console

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

>>> recupere_valeur(personnes, 'annee_nais', 1985, 'nom')
'Gemlamorte'

>>> recupere_valeur(personnes, 'genre', 'M', 'annee_nais')
2000

Une solution
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
def recupere_valeur(table, attribut1, valeur1, attribut2):
    """
    table - list, Table de données représentée par un tableau de dictionnaires ayant les mêmes clés
    attribut1, attribut2 - str, chaînes de caractères représentant une des clés
    valeur1 - doit être du même type que les valeurs de la clé attribut1
    Sortie: la valeur de la clé attribut2 de cette ligne,
            None si attribut1 ne prend jamais la valeur valeur1
    """
    for dico in table:
        if dico[attribut1] == valeur1 :
            return dico[attribut2]
    return None
Remarques importantes
  1. On peut constater que cette fonction n'est pas forcément performante.
    En effet, dans le second appel, elle ne renvoie que la valeur recherchée pour la première ligne rencontrée. Nous améliorerons ce comportement au fur et à mesure du chapitre.
  2. La fonction recupere_valeur() est déjà définie dans le module fonctions_csv.py.
    Par conséquent, il n'est pas nécessaire de la copier/coller d'un programme à l'autre : il suffira d'importer le module fonctions_csv pour pouvoir utiliser cette fonction.

Comptage d'occurences

Principe

  1. On initialise un compteur à zéro.
  2. On parcourt l'ensemble des lignes de la table de données.
  3. Pour chaque ligne, on identifie la valeur correspondant à l'attribut choisi.
  4. Si cette valeur est celle recherchée, on incrémente le compteur de 1
  5. Enfin, on renvoie la valeur de ce compteur.

Exemple

Copiez, collez et complétez la définition de la fonction compte_valeur() qui renvoie le nombre d'occurences de attribut dont la valeur est valeur dans la table.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
def compte_valeur(table, attribut, valeur):
    """
    table - list, Table de données représentée par un tableau de dictionnaires ayant les mêmes clés
    attribut - str, chaînes de caractères représentant une des clés
    valeur - doit être du même type que les valeurs de la clé attribut
    Sortie : le nombre d'occurences de valeur pour la clé attribut
    """
    .....
    for dico in table:
        if ..... :
            .....
    return .....

##----- Programme principal et Tests -----##
if __name__ == '__main__':
    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}]

Tests dans la console

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

>>> compte_valeur(personnes, 'annee_nais', 1985)
1

>>> compte_valeur(personnes, 'genre', 'M')
4

Une solution
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
def compte_valeur(table, attribut, valeur):
    """
    table - list, Table de données représentée par un tableau de dictionnaires ayant les mêmes clés
    attribut - str, chaînes de caractères représentant une des clés
    valeur - doit être du même type que les valeurs de la clé attribut
    Sortie : le nombre d'occurences de valeur pour la clé attribut
    """
    compteur = 0
    for dico in table:
        if dico[attribut] == valeur :
            compteur += 1
    return compteur
Remarque importante

La fonction compte_valeur() est, elle aussi, déjà définie dans le module fonctions_csv.py.
Par conséquent, il n'est pas nécessaire de la copier/coller d'un programme à l'autre : il suffira d'importer le module fonctions_csv pour pouvoir utiliser cette fonction.