Traitement de données CSV avec un dictionnaire
Sélection suivant un critère et sans doublon
Question
Écrire une fonction qui renvoie la liste des noms de personnes dont le nom commence par une lettre (cette lettre est un paramètre de la fonction).
La liste ne contiendra pas de doublon (par exemple, avec la lettre T, on n'aura pas deux "Térieur" dans la liste).
def commencePar(lettre):
""" lettre -- lettre majuscule renvoie la liste des noms de personnes dont l'initiale du nom est lettre. """Indice
not in peut être une astuce de programmation...
Solution
Un code possible...
import csv
# ouverture en lecture du fichier csvwith open('personnes.csv', newline='') as fichier:
# on crée un objet DictReaderlecture = csv.DictReader(fichier, delimiter=',')
# transfo en listelignes = list(lecture)
def commencePar(lettre):
""" lettre -- lettre majuscule renvoie la liste des noms de personnes dont l'initiale du nom est lettre. """liste = []
for personne in lignes:
if personne['nom'][0] == lettre and personne['nom'] not in liste:
liste.append(personne['nom'])
return liste
# testprint(commencePar('B'))
print(commencePar('T'))
Vérifier l'unicité
Question
Écrire un code possible pour le corps de la fonction suivante :
def AllDiff(champ):
""" champ -- l'une des clefs du dictionnaire lignes renvoie True si toutes les données-lignes ont des valeurs de champ distinctes et renvoie False sinon. >>> AllDiff('nom') # il existe au moins deux noms identiques False >>> AllDiff('id_personne') # tous les id sont distincts True """Indice
On construit une liste dans laquelle on ajoute au fur et à mesure de la lecture les nouvelles valeurs. Si la nouvelle valeur lue est déjà présente dans la liste, on renvoie "faux".
Solution
import csv
# ouverture en lecture du fichier csvwith open('personnes.csv', newline='') as fichier:
# on crée un objet DictReaderlecture = csv.DictReader(fichier, delimiter=',')
# transfo en listelignes = list(lecture)
def AllDiff(champ):
""" champ -- l'une des clefs renvoie True si toutes les données-lignes ont des valeurs de champ distinctes et renvoie False sinon. >>> AllDiff('nom') # il existe au moins deux noms identiques False >>> AllDiff('id_personne') # tous les id sont distincts True """liste = []
for personne in lignes:
if personne[champ] in liste: return False
liste.append(personne[champ])
return True
Sélection multi-critères, sans doublon
Question
Écrire un code possible pour le corps de la fonction suivante :
def finEnEtNeApres(lettre, annee):
""" lettre -- une lettre en minuscule annee -- une année renvoie la liste, sans doublon, des noms de personnes dont le prénom se termine par lettre et qui sont nés après annee. >>> finEnEtNeApres('e', 1980) ['Gemlamorte', 'Verserre', 'Boréal', 'Dejeu', 'Hiple'] """Indice
On se rappellera comment on fait pour obtenir la dernière lettre d'une chaîne de caractère, sans connaître sa longueur...
Solution
import csv
# ouverture en lecture du fichier csvwith open('personnes.csv', newline='') as fichier:
# on crée un objet DictReaderlecture = csv.DictReader(fichier, delimiter=',')
# transfo en listelignes = list(lecture)
# on transforme les années de Naissance en entierfor personne in lignes:
personne['anneeNaissance'] = int(personne['anneeNaissance'])
def finEnEtNeApres(lettre, annee):
""" lettre -- une lettre en minuscule annee -- une année renvoie la liste, sans doublon, des noms de personnes dont le prénom se termine par lettre et qui sont nés après annee. >>> finEnEtNeApres('e', 1980) ['Gemlamorte', 'Verserre', 'Boréal', 'Dejeu', 'Hiple'] """liste = []
for personne in lignes:
if personne['prenom'][-1] == lettre and personne['anneeNaissance'] > annee:
if personne['nom'] not in liste:
liste.append(personne['nom'])
return liste