Cours Python : Les Dictionnaires et la fonction filter()
? Objectif du cours : Maîtriser les dictionnaires Python et la fonction filter() à travers des explications simples et de nombreux exemples pratiques.
Partie 1 : Les Dictionnaires Python - Les bases
1.1 Qu'est-ce qu'un dictionnaire ?
Un dictionnaire est comme un annuaire téléphonique ou un dictionnaire de langue :
- Tu cherches un mot (la
clé) → tu trouves sa définition (la valeur)
- Tu cherches un nom (la
clé) → tu trouves son numéro (la valeur)
? À retenir : Un dictionnaire stocke des paires clé → valeur. C'est une structure de données extrêmement utile dans la vraie vie !
Tableau comparatif : Liste vs Dictionnaire
| Caractéristique |
Liste |
Dictionnaire |
| Accès aux éléments |
Par index (position) : ma_liste[0] |
Par clé : mon_dict["nom"] |
| Ordre |
Ordonné (les positions comptent) |
Ordonné depuis Python 3.7 |
| Rapidité de recherche |
Lente (doit parcourir toute la liste) |
Très rapide (recherche directe par clé) |
| Exemple concret |
["pomme", "banane", "orange"] |
{"Alice": 15, "Bob": 12, "Charlie": 18} |
1.2 Créer un dictionnaire - Toutes les méthodes
? Exemple 1 : Création avec des accolades {}
# Un étudiant avec ses informations
etudiant = {
"nom": "Alice",
"age": 22,
"ville": "Paris",
"notes": [15, 18, 14], # Une liste comme valeur
"adresse": { # Un dictionnaire imbriqué !
"rue": "123 Rue de Paris",
"code_postal": "75001"
}
}
print(etudiant)
# Output complet avec toutes les informations
? Exemple 2 : Création avec dict()
# Plusieurs façons d'utiliser dict()
personne1 = dict(nom="Jean", age=30, ville="Lyon")
print(personne1) # {'nom': 'Jean', 'age': 30, 'ville': 'Lyon'}
# À partir d'une liste de tuples
liste_paires = [("nom", "Marie"), ("age", 25), ("ville", "Marseille")]
personne2 = dict(liste_paires)
print(personne2) # {'nom': 'Marie', 'age': 25, 'ville': 'Marseille'}
? Les clés doivent être immutables : Les clés peuvent être des
str,
int,
float,
tuple, mais PAS des listes !
valide = {1: "un", 2: "deux", (1,2): "tuple"} # ✅ Correct
invalide = {[1,2]: "liste"} # ❌ Erreur ! Une liste ne peut pas être une clé
1.3 Accéder et modifier les valeurs
? Exemple 3 : Toutes les façons d'accéder aux valeurs
magasin = {
"pommes": 50,
"bananes": 30,
"oranges": 20,
"fraises": 15
}
# Méthode 1 : Accès direct avec []
print(magasin["pommes"]) # 50
# print(magasin["kiwis"]) # ❌ KeyError ! Le produit n'existe pas
# Méthode 2 : Accès sécurisé avec .get()
print(magasin.get("bananes")) # 30
print(magasin.get("kiwis")) # None (pas d'erreur)
print(magasin.get("kiwis", 0)) # 0 (valeur par défaut)
# Méthode 3 : Vérifier si une clé existe
if "pommes" in magasin:
print("On a des pommes !")
? Exemple 4 : Modifier, ajouter, supprimer
inventaire = {"stylo": 10, "cahier": 5}
print("Départ:", inventaire)
# Modifier une valeur existante
inventaire["stylo"] = 15
print("Après modification:", inventaire) # {'stylo': 15, 'cahier': 5}
# Ajouter un nouvel article
inventaire["gomme"] = 8
print("Après ajout:", inventaire) # {'stylo': 15, 'cahier': 5, 'gomme': 8}
# Supprimer avec del
del inventaire["cahier"]
print("Après suppression:", inventaire) # {'stylo': 15, 'gomme': 8}
# Supprimer et récupérer la valeur avec pop()
article_retire = inventaire.pop("stylo")
print(f"Article retiré: {article_retire}") # 15
print("Final:", inventaire) # {'gomme': 8}
1.4 Parcourir un dictionnaire - Toutes les méthodes
? Exemple 5 : Les 4 façons de parcourir
notes = {"Alice": 15, "Bob": 12, "Charlie": 18, "Diana": 14}
# 1. Parcourir les clés
print("1. Parcours des clés:")
for eleve in notes:
print(f" {eleve}")
# 2. Parcourir les valeurs
print("\n2. Parcours des valeurs:")
for note in notes.values():
print(f" {note}")
# 3. Parcourir les clés et valeurs avec items()
print("\n3. Parcours clés-valeurs:")
for eleve, note in notes.items():
print(f" {eleve} a eu {note}/20")
# 4. Obtenir les clés sous forme de liste
liste_eleves = list(notes.keys())
print(f"\nListe des élèves: {liste_eleves}")
Partie 2 : La fonction filter() en détail
2.1 Comprendre filter() avec des analogies
filter() est comme un tamis ou un filtre à café :
- Tu verses ton mélange (la liste)
- Le filtre laisse passer certains éléments (ceux qui satisfont la condition)
- Les autres sont retenus
? Syntaxe à retenir :
resultat = filter(fonction_condition, liste_a_filtrer)
resultat_liste = list(resultat) # Conversion en liste pour voir le résultat
2.2 Exemples progressifs avec filter()
? Exemple 6 : Filtrer des nombres (avec fonction classique)
nombres = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# Définir une fonction de filtrage
def est_pair(n):
return n % 2 == 0
def est_impair(n):
return n % 2 != 0
def est_superieur_a_5(n):
return n > 5
# Appliquer les filtres
pairs = list(filter(est_pair, nombres))
impairs = list(filter(est_impair, nombres))
grands = list(filter(est_superieur_a_5, nombres))
print(f"Nombres pairs: {pairs}") # [2, 4, 6, 8, 10]
print(f"Nombres impairs: {impairs}") # [1, 3, 5, 7, 9]
print(f"Nombres > 5: {grands}") # [6, 7, 8, 9, 10]
? Exemple 7 : Filtrer avec des lambda (version compacte)
nombres = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# Les mêmes filtres en une ligne !
pairs = list(filter(lambda x: x % 2 == 0, nombres))
impairs = list(filter(lambda x: x % 2 != 0, nombres))
multiples_de_3 = list(filter(lambda x: x % 3 == 0, nombres))
print(f"Multiples de 3: {multiples_de_3}") # [3, 6, 9]
? Exemple 8 : Filtrer des chaînes de caractères
mots = ["python", "est", "super", "génial", "facile", "incroyable"]
# Différents critères de filtrage
mots_courts = list(filter(lambda mot: len(mot) <= 4, mots))
print(f"Mots courts (≤ 4 lettres): {mots_courts}") # ['est']
mots_long = list(filter(lambda mot: len(mot) > 5, mots))
print(f"Mots longs (> 5 lettres): {mots_long}") # ['python', 'génial', 'incroyable']
# Filtrer les mots qui contiennent la lettre 'e'
mots_avec_e = list(filter(lambda mot: 'e' in mot, mots))
print(f"Mots avec 'e': {mots_avec_e}") # ['est', 'super', 'génial', 'facile']
Partie 3 : Combiner dictionnaires et filter() - Cas pratiques
3.1 Filtrer des dictionnaires simples
? Exemple 9 : Filtrer les élèves ayant la moyenne
notes_classe = {
"Alice": 18,
"Bob": 8,
"Charlie": 12,
"Diana": 15,
"Eve": 7,
"Frank": 14
}
# Garder ceux qui ont la moyenne (≥ 10)
reussite = dict(filter(lambda eleve: eleve[1] >= 10, notes_classe.items()))
print("Élèves ayant réussi:", reussite)
# Output: {'Alice': 18, 'Charlie': 12, 'Diana': 15, 'Frank': 14}
# Garder ceux qui ont échoué (< 10)
echec = dict(filter(lambda eleve: eleve[1] < 10, notes_classe.items()))
print("Élèves en échec:", echec)
# Output: {'Bob': 8, 'Eve': 7}
? Exemple 10 : Filtrer par seuils multiples
ventes = {
"janvier": 4500,
"février": 5200,
"mars": 3800,
"avril": 6100,
"mai": 4300,
"juin": 5700
}
# Mois avec ventes entre 4000 et 5000
mois_moyens = dict(filter(lambda mois: 4000 <= mois[1] <= 5000, ventes.items()))
print("Mois moyens:", mois_moyens) # {'janvier': 4500, 'mai': 4300}
# Meilleurs mois (> 5000)
meilleurs_mois = dict(filter(lambda mois: mois[1] > 5000, ventes.items()))
print("Meilleurs mois:", meilleurs_mois) # {'février': 5200, 'avril': 6100, 'juin': 5700}
3.2 Dictionnaires imbriqués - Le cas avancé
? Exemple 11 : Base de données d'employés
employes = {
"emp001": {
"nom": "Martin",
"prenom": "Jean",
"age": 45,
"service": "Informatique",
"salaire": 45000
},
"emp002": {
"nom": "Bernard",
"prenom": "Marie",
"age": 32,
"service": "Marketing",
"salaire": 38000
},
"emp003": {
"nom": "Petit",
"prenom": "Pierre",
"age": 28,
"service": "Informatique",
"salaire": 42000
},
"emp004": {
"nom": "Durand",
"prenom": "Sophie",
"age": 51,
"service": "Direction",
"salaire": 65000
}
}
# 1. Employés de plus de 40 ans
seniors = dict(filter(lambda emp: emp[1]["age"] > 40, employes.items()))
print("Employés > 40 ans:")
for id_emp, infos in seniors.items():
print(f" {infos['prenom']} {infos['nom']} ({infos['age']} ans)")
# 2. Employés du service Informatique
informaticiens = dict(filter(lambda emp: emp[1]["service"] == "Informatique", employes.items()))
print("\nService Informatique:")
for id_emp, infos in informaticiens.items():
print(f" {infos['prenom']} {infos['nom']}")
# 3. Employés avec salaire > 40000
bien_payes = dict(filter(lambda emp: emp[1]["salaire"] > 40000, employes.items()))
print("\nSalaire > 40000€:")
for id_emp, infos in bien_payes.items():
print(f" {infos['prenom']} {infos['nom']}: {infos['salaire']}€")
⚠️ Piège à éviter : Quand on filtre des dictionnaires imbriqués, n'oublie pas la structure !
# item est un tuple (clé, valeur)
# Pour accéder aux données : item[1]["nom_du_champ"]
# ❌ Erreur courante
filter(lambda item: item["age"] > 30, ...) # Ne marche pas !
# ✅ Bonne façon
filter(lambda item: item[1]["age"] > 30, ...) # item[1] est le dictionnaire interne
Partie 4 : Exercices pratiques avec corrigés détaillés
Exercice 1 : Gestion de bibliothèque
bibliotheque = {
"livre001": {"titre": "Le Petit Prince", "auteur": "Saint-Exupéry", "annee": 1943, "disponible": True},
"livre002": {"titre": "1984", "auteur": "Orwell", "annee": 1949, "disponible": False},
"livre003": {"titre": "Dune", "auteur": "Herbert", "annee": 1965, "disponible": True},
"livre004": {"titre": "Fondation", "auteur": "Asimov", "annee": 1951, "disponible": True},
"livre005": {"titre": "Le Meilleur des mondes", "auteur": "Huxley", "annee": 1932, "disponible": False}
}
- Trouve tous les livres disponibles
- Trouve les livres publiés avant 1950
- Trouve les livres d'Orwell disponibles
Exercice 2 : Analyse de températures
temperatures = {
"Paris": [12, 15, 14, 18, 20, 19, 17],
"Lyon": [11, 14, 16, 19, 22, 21, 18],
"Marseille": [15, 18, 20, 23, 25, 24, 22],
"Lille": [10, 12, 13, 15, 17, 16, 14],
"Bordeaux": [13, 16, 18, 21, 23, 22, 20]
}
- Trouve les villes dont la température moyenne est > 18°C
- Trouve les villes qui ont eu au moins un jour à plus de 25°C
Exercice 3 : Panier d'achat
panier = {
"pommes": {"prix": 2.5, "quantite": 6, "bio": True},
"bananes": {"prix": 1.8, "quantite": 4, "bio": False},
"carottes": {"prix": 1.2, "quantite": 5, "bio": True},
"lait": {"prix": 1.0, "quantite": 2, "bio": True},
"chocolat": {"prix": 3.5, "quantite": 1, "bio": False}
}
- Trouve les produits bio
- Trouve les produits dont le prix unitaire est > 2.0€
- Trouve les produits bio dont la quantité est ≥ 5
Solutions détaillées
Solution Exercice 1
bibliotheque = {
"livre001": {"titre": "Le Petit Prince", "auteur": "Saint-Exupéry", "annee": 1943, "disponible": True},
"livre002": {"titre": "1984", "auteur": "Orwell", "annee": 1949, "disponible": False},
"livre003": {"titre": "Dune", "auteur": "Herbert", "annee": 1965, "disponible": True},
"livre004": {"titre": "Fondation", "auteur": "Asimov", "annee": 1951, "disponible": True},
"livre005": {"titre": "Le Meilleur des mondes", "auteur": "Huxley", "annee": 1932, "disponible": False}
}
# 1. Livres disponibles
livres_dispo = dict(filter(lambda livre: livre[1]["disponible"], bibliotheque.items()))
print("? Livres disponibles:")
for id_livre, infos in livres_dispo.items():
print(f" - {infos['titre']} par {infos['auteur']}")
# 2. Livres avant 1950
livres_anciens = dict(filter(lambda livre: livre[1]["annee"] < 1950, bibliotheque.items()))
print("\n? Livres publiés avant 1950:")
for id_livre, infos in livres_anciens.items():
print(f" - {infos['titre']} ({infos['annee']})")
# 3. Livres d'Orwell disponibles
orwell_dispo = dict(filter(lambda livre: livre[1]["auteur"] == "Orwell" and livre[1]["disponible"], bibliotheque.items()))
print("\n? Livres d'Orwell disponibles:")
if orwell_dispo:
for id_livre, infos in orwell_dispo.items():
print(f" - {infos['titre']}")
else:
print(" Aucun livre d'Orwell disponible")
Solution Exercice 2
temperatures = {
"Paris": [12, 15, 14, 18, 20, 19, 17],
"Lyon": [11, 14, 16, 19, 22, 21, 18],
"Marseille": [15, 18, 20, 23, 25, 24, 22],
"Lille": [10, 12, 13, 15, 17, 16, 14],
"Bordeaux": [13, 16, 18, 21, 23, 22, 20]
}
# 1. Villes avec moyenne > 18°C
def moyenne(liste):
return sum(liste) / len(liste)
villes_chaudes = dict(filter(lambda ville: moyenne(ville[1]) > 18, temperatures.items()))
print("?️ Villes avec température moyenne > 18°C:")
for ville, temps in villes_chaudes.items():
print(f" - {ville}: {moyenne(temps):.1f}°C")
# 2. Villes avec au moins un jour > 25°C
villes_tres_chaudes = dict(filter(lambda ville: max(ville[1]) > 25, temperatures.items()))
print("\n☀️ Villes avec au moins un jour > 25°C:")
for ville, temps in villes_tres_chaudes.items():
print(f" - {ville}: max {max(temps)}°C")
Solution Exercice 3
panier = {
"pommes": {"prix": 2.5, "quantite": 6, "bio": True},
"bananes": {"prix": 1.8, "quantite": 4, "bio": False},
"carottes": {"prix": 1.2, "quantite": 5, "bio": True},
"lait": {"prix": 1.0, "quantite": 2, "bio": True},
"chocolat": {"prix": 3.5, "quantite": 1, "bio": False}
}
# 1. Produits bio
produits_bio = dict(filter(lambda item: item[1]["bio"], panier.items()))
print("? Produits bio:")
for produit, infos in produits_bio.items():
print(f" - {produit}: {infos['quantite']} x {infos['prix']}€")
# 2. Produits avec prix > 2.0€
produits_chers = dict(filter(lambda item: item[1]["prix"] > 2.0, panier.items()))
print("\n? Produits chers (>2.0€):")
for produit, infos in produits_chers.items():
print(f" - {produit}: {infos['prix']}€")
# 3. Produits bio avec quantité ≥ 5
bio_en_stock = dict(filter(lambda item: item[1]["bio"] and item[1]["quantite"] >= 5, panier.items()))
print("\n✅ Produits bio en bonne quantité:")
for produit, infos in bio_en_stock.items():
print(f" - {produit}: {infos['quantite']} unités")
? Résumé des points clés à retenir :
- Dictionnaire : structure clé-valeur avec accès rapide
- .items() : essentiel pour parcourir clés ET valeurs
- .get() : toujours préférer .get() à [] pour éviter les erreurs
- filter() : prend une fonction et un itérable, retourne un filtre
- Lambda : parfait pour des fonctions simples dans filter()
- Combinaison : filter() + .items() + dict() = filtrage puissant
✨ N'hésite pas à pratiquer sur pandacodeur la programmation s'apprend en faisant.