Des tableaux de données : listes de dictionnaires
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