LyCode Lab

Chapitre 2 : Critères, doublons, cohérence

Rechercher dans une table

Une table de quelques milliers de lignes ne se lit pas : elle s'interroge. Chercher, c'est parcourir les lignes et ne garder que celles qui vérifient un critère. Dans ce chapitre, tu apprends à exprimer des critères avec la logique (and, or, not), à chercher une ligne précise, à repérer les doublons et à tester la cohérence des données.

Au programme de NSI : Traitement de données en tables : Recherche dans une table. Rechercher les lignes d'une table vérifiant des critères exprimés en logique propositionnelle. Rechercher des doublons, tester la cohérence d'une table.

Garder les lignes qui vérifient un critère

Le schéma est toujours le même : on part d'un tableau vide, on parcourt la table, et on ajoute à ce tableau chaque ligne qui vérifie la condition d'un if.

Les visiteurs de Brest
import csv

with open('visiteurs.csv', encoding='utf-8') as f:
    table = list(csv.DictReader(f))

brestois = []
for ligne in table:
    if ligne['ville'] == 'Brest':
        brestois.append(ligne['nom'])
print(brestois)

Avec une compréhension, la même recherche tient en une ligne : brestois = [l['nom'] for l in table if l['ville'] == 'Brest'].

Des critères composés : et, ou, non

Un critère se construit avec des opérateurs de comparaison (==, !=, <, <=, >, >=) et des connecteurs logiques. Avec des parenthèses, on évite les ambiguïtés.

ConnecteurPythonVrai quand
etA and BA et B sont vraies toutes les deux
ouA or Bau moins une des deux est vraie
nonnot AA est fausse
Les mineurs, ou les visiteurs arrivés avant 10 heures
cibles = []
for ligne in table:
    mineur = int(ligne['age']) < 18
    tot = ligne['entree'] < '10:00'
    if mineur or tot:
        cibles.append(ligne['nom'])

Chercher une seule ligne

Pour retrouver une ligne, on parcourt la table et on s'arrête dès qu'on l'a trouvée. Dans une fonction, return interrompt tout de suite le parcours. Si on arrive à la fin sans rien trouver, on renvoie None (« rien »).

Une recherche avec arrêt anticipé
def chercher(table, nom):
    for ligne in table:
        if ligne['nom'] == nom:
            return ligne
    return None

print(chercher(table, 'Petit'))
print(chercher(table, 'Inconnu'))

Doublons et cohérence

Un fichier saisi à la main contient souvent des erreurs : une ligne en double, un âge impossible, une heure qui n'existe pas. Avant d'exploiter une table, on teste sa cohérence. Pour repérer un doublon, on mémorise ce qu'on a déjà vu.

registre.csv : Un registre saisi à la main : saurais-tu y repérer les anomalies ?
nom,prenom,age,ville,entree
Durand,Armand,45,Brest,09:15
Martin,Julie,17,Quimper,09:40
Bernard,Karim,290,Brest,10:05
Petit,Sofia,34,Rennes,10:20
Martin,Julie,17,Quimper,09:40
Richard,Emma,52,Nantes,25:00
Moreau,Hugo,23,Quimper,11:10
Simon,Lina,-4,Rennes,11:25
Laurent,Noah,19,Brest,11:50
Lefebvre,Jade,38,Nantes,12:05
Repérer les valeurs impossibles
invalides = []
for ligne in table:
    age = int(ligne['age'])
    if age < 0 or age > 120:
        invalides.append(ligne['nom'])

À toi de jouer : Exercice guidé

Complète la condition pour que brestois contienne les noms des visiteurs dont la ville est 'Brest', dans l'ordre du fichier.

Passer à l'énigme : Le suspect dans le registre