Beaucoup de programmes passent leur temps à manipuler des collections de données : notes d'élèves, transactions, capteurs, articles... Ce chapitre rassemble les 4 opérations de base qu'on applique à des volumes de données, et montre comment les combiner pour produire des résultats utiles.
Les 4 opérations de base
| Opération | Rôle | Résultat |
|---|---|---|
| Filtrer | Garder un sous-ensemble selon un critère | Nouvelle collection (éventuellement plus petite) |
| Transformer | Appliquer une fonction à chaque élément | Nouvelle collection (même taille) |
| Agréger | Combiner tous les éléments en une valeur unique | Une valeur (somme, moyenne, max...) |
| Grouper | Répartir les éléments par catégorie | Dictionnaire par catégorie |
Vous verrez ces 4 opérations partout : Excel (filtres, formules, pivot), SQL (WHERE, SELECT, SUM, GROUP BY), Pandas... et bien sûr en Python.
Pour toutes les démos, on utilisera le même jeu de données :
etudiants = [
{"nom": "Alice", "classe": "A", "note": 14, "age": 20},
{"nom": "Bob", "classe": "B", "note": 8, "age": 22},
{"nom": "Charlie", "classe": "A", "note": 17, "age": 19},
{"nom": "Diana", "classe": "B", "note": 9, "age": 21},
{"nom": "Eve", "classe": "A", "note": 15, "age": 20},
{"nom": "Frank", "classe": "B", "note": 11, "age": 23},
{"nom": "Grace", "classe": "A", "note": 18, "age": 19},
]Filtrer une collection
Filtrer = conserver uniquement les éléments qui vérifient une condition.
Avec une boucle explicite
etudiants = [
{"nom": "Alice", "classe": "A", "note": 14, "age": 20},
{"nom": "Bob", "classe": "B", "note": 8, "age": 22},
{"nom": "Charlie", "classe": "A", "note": 17, "age": 19},
{"nom": "Diana", "classe": "B", "note": 9, "age": 21},
{"nom": "Eve", "classe": "A", "note": 15, "age": 20},
{"nom": "Frank", "classe": "B", "note": 11, "age": 23},
{"nom": "Grace", "classe": "A", "note": 18, "age": 19},
]
# Filtrer : les étudiants ayant 10 ou plus
admis = []
for e in etudiants:
if e["note"] >= 10:
admis.append(e)
print(f"{len(admis)} étudiants admis")
for e in admis:
print(f" {e['nom']} : {e['note']}")Avec une compréhension de liste
La même chose en une ligne avec une compréhension de liste (chapitre 1 de cette partie) :
etudiants = [
{"nom": "Alice", "classe": "A", "note": 14, "age": 20},
{"nom": "Bob", "classe": "B", "note": 8, "age": 22},
{"nom": "Charlie", "classe": "A", "note": 17, "age": 19},
{"nom": "Diana", "classe": "B", "note": 9, "age": 21},
{"nom": "Eve", "classe": "A", "note": 15, "age": 20},
{"nom": "Frank", "classe": "B", "note": 11, "age": 23},
{"nom": "Grace", "classe": "A", "note": 18, "age": 19},
]
admis = [e for e in etudiants if e["note"] >= 10]
print(f"{len(admis)} étudiants admis")C'est plus court, plus lisible, et plus rapide : c'est la forme à privilégier dès que le filtre tient en une condition.
Filtrage avec la fonction filter()
Python propose aussi la fonction native filter(). Moins utilisée aujourd'hui au profit des compréhensions, mais à reconnaître pour le TOSA.
etudiants = [
{"nom": "Alice", "note": 14},
{"nom": "Bob", "note": 8},
{"nom": "Eve", "note": 15},
]
admis = list(filter(lambda e: e["note"] >= 10, etudiants))
print(admis)filter(fonction, iterable) renvoie un itérateur — d'où le list(...) pour voir le résultat.
Transformer une collection
Transformer = appliquer une fonction à chaque élément pour produire une nouvelle collection.
Avec une boucle
notes = [12, 15, 9, 17, 11]
# Convertir en note sur 100
notes_100 = []
for n in notes:
notes_100.append(n * 5)
print(notes_100)Avec une compréhension
notes = [12, 15, 9, 17, 11]
notes_100 = [n * 5 for n in notes]
print(notes_100)Extraire un champ d'une liste de dicts (cas très fréquent)
etudiants = [
{"nom": "Alice", "note": 14},
{"nom": "Bob", "note": 8},
{"nom": "Eve", "note": 15},
]
# Ne garder que les noms
noms = [e["nom"] for e in etudiants]
print(noms)
# Ne garder que les notes
notes = [e["note"] for e in etudiants]
print(notes)Avec la fonction map()
Comme pour filter(), Python propose map(fonction, iterable). Moins utilisée aujourd'hui.
notes = [12, 15, 9, 17]
notes_100 = list(map(lambda n: n * 5, notes))
print(notes_100)