# -*- coding: utf-8 -*- """ Corrigé Python - Bac NSI 2026 - Épreuve pratique - Sujet 18 Thème : températures en Polynésie, anomalies et regroupement par décennie """ from __future__ import annotations donnees_test = [ {"date": "2010-01-15", "zone": "Societe", "temperature": 27.0}, {"date": "2010-06-20", "zone": "Societe", "temperature": 26.5}, {"date": "2011-03-10", "zone": "Societe", "temperature": 27.5}, {"date": "2020-02-14", "zone": "Societe", "temperature": 28.0}, {"date": "2020-08-22", "zone": "Societe", "temperature": 28.5}, {"date": "2021-05-30", "zone": "Societe", "temperature": 29.0}, {"date": "2015-04-10", "zone": "Tuamotu", "temperature": 26.8}, {"date": "2020-07-15", "zone": "Tuamotu", "temperature": 27.5}, {"date": "2021-09-20", "zone": "Tuamotu", "temperature": 28.0}, {"date": "2020-03-15", "zone": "Marquises", "temperature": 25.5}, {"date": "2021-07-10", "zone": "Marquises", "temperature": 26.0}, {"date": "2022-11-25", "zone": "Marquises", "temperature": 26.5}, ] def temperature_moyenne(zone: str, donnees: list[dict]) -> float | None: temperatures = [r["temperature"] for r in donnees if r["zone"] == zone] if len(temperatures) == 0: return None return sum(temperatures) / len(temperatures) def detecter_anomalies(zone: str, seuil: float, donnees: list[dict]) -> list[str]: moyenne = temperature_moyenne(zone, donnees) if moyenne is None: return [] dates = [] for releve in donnees: if releve["zone"] == zone and abs(releve["temperature"] - moyenne) > seuil: dates.append(releve["date"]) return dates def evolution_par_decennie(zone: str, donnees: list[dict]) -> dict[int, float]: """Calcule la température moyenne par décennie. Correction : 2010, 2020, ...""" releves_zone = [r for r in donnees if r["zone"] == zone] if len(releves_zone) == 0: return {} temperatures_par_decennie = {} for releve in releves_zone: annee = int(releve["date"].split("-")[0]) decennie = (annee // 10) * 10 if decennie not in temperatures_par_decennie: temperatures_par_decennie[decennie] = [] temperatures_par_decennie[decennie].append(releve["temperature"]) moyennes = {} for decennie, temperatures in temperatures_par_decennie.items(): moyennes[decennie] = round(sum(temperatures) / len(temperatures), 2) return moyennes def test_zone_inexistante() -> None: assert evolution_par_decennie("Inconnue", donnees_test) == {} def test_une_seule_decennie() -> None: assert evolution_par_decennie("Marquises", donnees_test) == {2020: 26.0} def test_plusieurs_decennies() -> None: assert evolution_par_decennie("Societe", donnees_test) == {2010: 27.0, 2020: 28.5} def tests() -> None: assert temperature_moyenne("Societe", donnees_test) == 27.75 assert temperature_moyenne("Inconnue", donnees_test) is None assert detecter_anomalies("Societe", 1.0, donnees_test) == ["2010-06-20", "2021-05-30"] test_zone_inexistante() test_une_seule_decennie() test_plusieurs_decennies() print("Tous les tests du sujet 18 sont passés.") if __name__ == "__main__": tests()