COURS 15 PYTHON

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}
}
  1. Trouve tous les livres disponibles
  2. Trouve les livres publiés avant 1950
  3. 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]
}
  1. Trouve les villes dont la température moyenne est > 18°C
  2. 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}
}
  1. Trouve les produits bio
  2. Trouve les produits dont le prix unitaire est > 2.0€
  3. 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.

 

Questions / Réponses

Aucune question. Soyez le premier à poser une question.
Aucune note. Soyez le premier à attribuer une note !

Ajouter un commentaire

Anti-spam