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).

1
def commencePar(lettre):
2
    """
3
    lettre -- lettre majuscule
4
5
    renvoie la liste des noms de personnes  
6
    dont l'initiale du nom est lettre.
7
    """

Indice

not in peut être une astuce de programmation...

Solution

Un code possible...

1
import csv
2
3
# ouverture en lecture du fichier csv
4
with open('personnes.csv', newline='') as fichier:
5
    # on crée un objet DictReader
6
    lecture = csv.DictReader(fichier, delimiter=',')
7
8
    # transfo en liste
9
    lignes = list(lecture)
10
11
def commencePar(lettre):
12
    """
13
    lettre -- lettre majuscule
14
15
    renvoie la liste des noms de personnes  
16
    dont l'initiale du nom est lettre.
17
    """
18
    liste = []
19
    for personne in lignes:
20
        if personne['nom'][0] == lettre and personne['nom'] not in liste:
21
            liste.append(personne['nom'])
22
    return liste
23
24
# test
25
print(commencePar('B'))
26
print(commencePar('T'))

Vérifier l'unicité

Question

Écrire un code possible pour le corps de la fonction suivante :

1
def AllDiff(champ):
2
    """
3
    champ -- l'une des clefs du dictionnaire  lignes
4
5
    renvoie True si toutes les données-lignes 
6
    ont des valeurs de champ distinctes
7
    et renvoie False sinon.
8
    >>> AllDiff('nom') # il existe au moins deux noms identiques
9
    False
10
    >>> AllDiff('id_personne') # tous les id sont distincts
11
    True 
12
    """

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

1
import csv
2
3
# ouverture en lecture du fichier csv
4
with open('personnes.csv', newline='') as fichier:
5
    # on crée un objet DictReader
6
    lecture = csv.DictReader(fichier, delimiter=',')
7
8
    # transfo en liste
9
    lignes = list(lecture)
10
11
def AllDiff(champ):
12
    """
13
    champ -- l'une des clefs  
14
15
    renvoie True si toutes les données-lignes 
16
    ont des valeurs de champ distinctes
17
    et renvoie False sinon.
18
    >>> AllDiff('nom') # il existe au moins deux noms identiques
19
    False
20
    >>> AllDiff('id_personne') # tous les id sont distincts
21
    True 
22
    """
23
    liste = []
24
    for personne in lignes:
25
        if personne[champ] in liste: return False
26
        liste.append(personne[champ])
27
    return True   

Sélection multi-critères, sans doublon

Question

Écrire un code possible pour le corps de la fonction suivante :

1
def finEnEtNeApres(lettre, annee):
2
    """
3
    lettre -- une lettre en minuscule
4
    annee -- une année
5
6
    renvoie la liste, sans doublon, des noms de personnes
7
    dont le prénom se termine par lettre et qui sont nés après annee.
8
    >>> finEnEtNeApres('e', 1980)
9
    ['Gemlamorte', 'Verserre', 'Boréal', 'Dejeu', 'Hiple']
10
    """

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

1
import csv
2
3
# ouverture en lecture du fichier csv
4
with open('personnes.csv', newline='') as fichier:
5
    # on crée un objet DictReader
6
    lecture = csv.DictReader(fichier, delimiter=',')
7
8
    # transfo en liste
9
    lignes = list(lecture)
10
11
# on transforme les années de Naissance en entier
12
for personne in lignes:
13
    personne['anneeNaissance'] = int(personne['anneeNaissance'])
14
15
def finEnEtNeApres(lettre, annee):
16
    """
17
    lettre -- une lettre en minuscule
18
    annee -- une année
19
20
    renvoie la liste, sans doublon, des noms de personnes
21
    dont le prénom se termine par lettre et qui sont nés après annee.
22
    >>> finEnEtNeApres('e', 1980)
23
    ['Gemlamorte', 'Verserre', 'Boréal', 'Dejeu', 'Hiple']
24
    """
25
    liste = []
26
    for personne in lignes:
27
        if personne['prenom'][-1] == lettre and personne['anneeNaissance'] > annee:
28
            if personne['nom'] not in liste:
29
                liste.append(personne['nom'])
30
    return liste