ParcoursOuvrir l'appli

Des tableaux de données : listes de dictionnaires

Python, dictionnaires et compréhensions · 45 min

Un tableau, en Python

Un tableau Excel a des lignes et des colonnes. En Python, la façon la plus naturelle de le représenter est une liste de dictionnaires : une ligne par dictionnaire, une clé par colonne.

nom ville age
Awa Douala 19
Boris Yaoundé 22
clients = [
    {"nom": "Awa", "ville": "Douala", "age": 19},
    {"nom": "Boris", "ville": "Yaoundé", "age": 22},
]

Un code bien présenté sur plusieurs lignes est autorisé entre crochets ou accolades : Python sait que l'instruction continue jusqu'à la fermeture.

Pour lire une case : la ligne avec l'index, puis la colonne avec la clé.

clients[1]["ville"]      # 'Yaoundé'

Et pour parcourir le tableau :

for client in clients:
    print(client["nom"], client["ville"])

Trier avec `key`

Pour trier une liste de dictionnaires, sorted doit savoir sur quelle colonne comparer. On le lui dit avec le paramètre key, en lui donnant une fonction qui, pour chaque élément, renvoie la valeur à comparer.

def age_du_client(client):
    return client["age"]

par_age = sorted(clients, key=age_du_client)

Les fonctions express : lambda

Écrire une fonction de deux lignes juste pour trier est lourd. Python permet d'écrire une petite fonction sans nom, en une ligne, directement là où on en a besoin :

par_age = sorted(clients, key=lambda client: client["age"])
du_plus_vieux = sorted(clients, key=lambda c: c["age"], reverse=True)

Le nom vient de la lettre grecque lambda, utilisée dans les années 1930 par le mathématicien Alonzo Church pour décrire les fonctions. On l'utilise seulement pour des fonctions très courtes, d'une expression.

Exercice : Les clients de Douala

Construis la liste noms_douala des noms des clients qui habitent à Douala, dans l'ordre.

Voir une solution
clients = [{"nom": "Awa", "ville": "Douala"}, {"nom": "Boris", "ville": "Yaoundé"}, {"nom": "Chantal", "ville": "Douala"}]   # donné

noms_douala = []
for client in clients:
    if client["ville"] == "Douala":
        noms_douala.append(client["nom"])

Dans l'appli, ton code est exécuté et corrigé automatiquement. Faire l'exercice

Exercice : Le chiffre d'affaires de la journée

Chaque commande a un "prix" unitaire et une "quantite". Calcule dans chiffre le total de toutes les commandes payées (celles dont "payee" vaut True).

Voir une solution
commandes = [{"prix": 500, "quantite": 3, "payee": True}, {"prix": 1200, "quantite": 2, "payee": False}, {"prix": 1500, "quantite": 1, "payee": True}]   # donné

chiffre = 0
for commande in commandes:
    if commande["payee"]:
        chiffre += commande["prix"] * commande["quantite"]

Dans l'appli, ton code est exécuté et corrigé automatiquement. Faire l'exercice

Exercice : Le classement

Trie les élèves de la meilleure note à la moins bonne dans classement, avec sorted, key et une lambda. Puis range dans podium les noms des trois premiers.

Voir une solution
eleves = [{"nom": "Awa", "note": 14}, {"nom": "Boris", "note": 17}, {"nom": "Chantal", "note": 9}, {"nom": "Didier", "note": 15}]   # donné

classement = sorted(eleves, key=lambda e: e["note"], reverse=True)
podium = []
for e in classement[:3]:
    podium.append(e["nom"])

Dans l'appli, ton code est exécuté et corrigé automatiquement. Faire l'exercice

Exercice : Regrouper par ville

Construis le dictionnaire par_ville qui associe à chaque ville la liste des noms de ses clients.

Résultat attendu : {"Douala": ["Awa", "Chantal"], "Yaoundé": ["Boris"]}.

C'est le motif du compteur, mais avec une liste au lieu d'un nombre : .get(ville, []) puis on ajoute le nom.

Voir une solution
clients = [{"nom": "Awa", "ville": "Douala"}, {"nom": "Boris", "ville": "Yaoundé"}, {"nom": "Chantal", "ville": "Douala"}]   # donné

par_ville = {}
for client in clients:
    ville = client["ville"]
    par_ville[ville] = par_ville.get(ville, []) + [client["nom"]]

Dans l'appli, ton code est exécuté et corrigé automatiquement. Faire l'exercice