Recherche dans des données en tables
Recherche simple
Premières recherches
Une fois les données indexées, il faut les exploiter.
La première exploitation est bien sur la recherche de données. Voici une fonction de recherche de données :
def recherche(donnees, clef_rech, val_rech, clef_aff):
"""
donnees : tableau de dictionnaires contenant les données
clef_rech : clef à laquelle appartient la valeur recherchée
val_rech : valeur recherchée
clef_aff : clef de la valeur que l'on veut afficher
"""
for element in donnees:
if element[clef_rech] == val_rech:
return element[clef_aff]
Vous ne voyez peut-être pas la différence entreclef_rech et clef_aff, nous allons donc mener quelques recherches :
- Dans le même script, regroupez la fonction
index_dicoet la fonctionrecherche. - Grâce à la fonction
recherche, rechercher :- la monnaie utilisée au Botswana
- la superficie de Hong Kong
- le code iso de la Micronésie (Micronesia)
- le pays dont le code iso est CR
Gestion des doublons
La fonction précédente n'est en fait pas très "robuste". Nous allons donc tenter de la mettre en échec :
- Rechercher le nom des pays dont la monnaie est l'euro.
- Quel problème apparaît ici ?
Il va donc falloir gérer les doublons dans nos recherches.
Pour cela nous allons devoir construire un tableau contenant toutes les réponses à une recherche pour regrouper les éventuels doublons.
Une des solutions "élégante" et compacte est d'utiliser la création de tableau par compréhension.
En testant et le code ci-dessous puis en s'en inspirant :
tabDico = [{'couleur':'rouge','nom':'chaperon'},{'couleur':"bleue",'nom':'Les Schtroumpfs'},{'couleur':'vert','nom':'martien'}]
resultat=[r['nom'] for r in tabDico if r['couleur']=='vert']
print (resultat)
- coder une fonction
recherche2(donnees, clef_rech, val_rech, clef_aff)qui renvoie le tableau des réponses à la recherche.
Cette fonction peut s'écrire en une seule ligne ! - Tester ensuite la fonction, et vérifier qu'elle renvoie à présent un résultat correct.
Recherche par critères
Nous avons, jusque là, effectué des recherches "simples" sur un seul critère.
Dans la pratique les recherches sur les bases de données sont souvent multicritères.
Par exemple : "Rechercher les pays de la zone euro dont la population est inférieure à 100 000 habitants" .
- Énoncer en une phrase la recherche effectuée par le code ci-dessous:
[p['name'] for p in tabDico if int(p['population'])<1000 or float(p['area'])>10000000)] - Coder la fonction
rechercheA(donnees)qui renvoie la liste des pays de la zone Euro dont la population est inférieure à 100 000 habitants - Coder la fonction
rechercheB(donnees)qui renvoie le nom des pays dont la monnaie est le Dollar et dont la superficie est supérieure à 9000000 km²
Tests de cohérence
Quand on gère une grande quantité de données, la difficulté est de maintenir constamment la cohérence des données.
En effet des erreurs peuvent apparaître lors de la saisie ou de la mise à jour des données.
Pour cela il est nécessaire de faire des tests de cohérence régulièrement sur les données.
La cohérence des données contenues dans une table peut porter sur différents points :
- Le domaine des données (une surface est un nombre, le code du pays est formé de deux lettres majuscules...)
- Le contenu des données (deux pays ne peuvent pas avoir le même code, le code du continent est forcément pris dans la liste ('AF', 'AS', 'EU', 'NA', 'OC', 'SA') ...)
Les données contenues dans le fichier dont vous disposez comportent deux erreurs de cohérence.
Vous devez :
- Coder une fonction
coherenceA(donnees)permettant de détecter une incohérence de domaine sur le champcapitalqui doit contenir le code de la ville capitale du pays concerné. - Coder une fonction
coherenceB(donnees)permettant de de détecter une incohérence de contenu sur le champcontinent.