Ce projet a pour objectif de développer une application web Flask permettant d'explorer les résultats d'une élection américaine par état, avec des données fournies au format JSON. Vous manipulerez les routes statiques et dynamiques pour afficher des informations variées sur les résultats des élections, avec des fonctions adaptées pour récupérer et filtrer les données.
Les données concernant les états américains sont fournies sous forme de liste d'objets JSON. Voici la structure de chaque objet :
{
"article": "l'",
"court": "Arizona",
"nom": "Arizona",
"typo_2020": "d+",
"grd_2020": "11",
"2020": "d",
"typo": "–",
"chgt_grd": null,
"grd": "11",
"vainqueur": "r",
"champlibre": null,
"code": "AZ"
}
article : Article grammatical pour le nom de l'état (ex. "l'", "le").court : Nom court de l'état.nom : Nom complet de l'état.typo_2020 : Tendance politique en 2020 (par exemple, "d+" pour démocrate).grd_2020 : Nombre de grands électeurs en 2020.2020 : Parti vainqueur en 2020 ("d" pour démocrate, "r" pour républicain).typo : Tendance politique actuelle.chgt_grd : Variation dans le nombre de grands électeurs par rapport à 2020 (null si inchangé).grd : Nombre actuel de grands électeurs.vainqueur : Parti vainqueur de l'élection actuelle.champlibre : Champ libre pour des données supplémentaires (actuellement null).code : Code postal de l'état (par exemple, "AZ" pour l'Arizona)./vainqueurCréez une route statique /vainqueur qui affiche le vainqueur de l'élection actuelle (le parti ayant remporté le plus d'états). Pour cela :
r, d, ou autres)./etats/<code_etat>Créez une route dynamique /etats/<code_etat> qui affiche les détails d’un état spécifique, en utilisant son code (par exemple, "AZ" pour l'Arizona). Pour cela :
/partis/<code_etat>Créez une route dynamique /partis/<code_etat> qui affiche tous les états ayant voté pour un parti spécifique. Pour cela :
vainqueur correspond au code du parti (r, d, etc.)./basculesCréez une route /bascules qui affiche la liste des états ayant basculé d’un parti à un autre depuis 2020. Un état est considéré comme ayant "basculé" si le champ 2020 (vainqueur en 2020) est différent du champ vainqueur (vainqueur actuel). Pour cela :
/etats/<code_etat> pour afficher les informations des états./electeurs/<int:nombre>Créez une route dynamique /electeurs/<int:nombre> qui affiche les états ayant au moins un certain nombre de grands électeurs. Pour cela :
grd est supérieur ou égal à nombre.BONUS: affichez la carte des étatsExercice en cours d'élaboration. Vous pouvez essayer de le résoudre avec l'IA, même si l'énoncé n'est pas encore complet.
Vous allez maintenant afficher une carte des états colorée en fonction des résultats des élections:
Pour ce faire, téléchargez les fichiers us2.json et us2.svg en pièce jointe.
Le but de l'exercice est de créer une version dynamique du fichier SVG en utilisant les données du fichier JSON.
map.svg dans le dossier templates{%include "map.svg" %}.us2.json.Organisez votre projet comme suit :
elections/
│
├── static/
│ └── css/ (styles pour vos templates, facultatif)
│
├── templates/
│ ├── index.html (page d'accueil ou autre)
│ ├── vainqueur.html
│ ├── etat.html
│ └── liste_etats.html
│
├── app.py
└── data.json (fichier contenant les données JSON)
Chargez les données JSON dans Flask au démarrage de l'application en les lisant depuis un fichier externe (data.json) :
import json
with open('data.json', 'r') as file:
data = json.load(file)
Vous pourrez ensuite parcourir ces données avec des boucles ou des filtres dans vos routes.
Filtrer une liste en Python signifie créer une nouvelle liste contenant uniquement les éléments qui répondent à une condition donnée. Voici comment le faire de deux façons :
Cette méthode consiste à utiliser une boucle for pour parcourir chaque élément de la liste, vérifier si l'élément satisfait la condition, et ajouter cet élément à une nouvelle liste si la condition est remplie.
# Liste initiale
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# Filtrer "à la main"
filtered_numbers = []
for number in numbers:
if number % 2 == 0: # Vérifie si le nombre est pair
filtered_numbers.append(number)
print(filtered_numbers) # Résultat : [2, 4, 6, 8, 10]
Python propose des outils modernes et élégants pour filtrer une liste, comme les compréhensions de liste ou la fonction filter(). Ces méthodes sont concises, lisibles et plus rapides à écrire.
Une compréhension de liste permet de combiner une boucle et une condition en une seule ligne.
# Liste initiale
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# Filtrage avec une compréhension de liste
filtered_numbers = [number for number in numbers if number % 2 == 0]
print(filtered_numbers) # Résultat : [2, 4, 6, 8, 10]
filter()La fonction filter() est une fonction intégrée qui prend deux arguments :
True ou False (la condition).Elle retourne un itérable contenant uniquement les éléments qui répondent à la condition.
# Liste initiale
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# Fonction pour tester si un nombre est pair
def is_even(number):
return number % 2 == 0
# Filtrage avec filter()
filtered_numbers = list(filter(is_even, numbers))
print(filtered_numbers) # Résultat : [2, 4, 6, 8, 10]
Vous pouvez également utiliser une lambda pour rendre le tout plus concis :
filtered_numbers = list(filter(lambda number: number % 2 == 0, numbers))
print(filtered_numbers) # Résultat : [2, 4, 6, 8, 10]
map, reduce, etc.).| Méthode | Cas d'utilisation |
|---|---|
| Boucle "à la main" | Pour les débutants ou pour des cas très spécifiques nécessitant une logique complexe dans la boucle. |
| Compréhension de liste | À privilégier : concis, lisible, idiomatique pour la plupart des cas. |
filter() |
À utiliser si vous avez déjà une fonction séparée pour la condition, ou dans des traitements en chaîne. |
En général, la compréhension de liste est la meilleure option : elle est rapide à écrire, facile à comprendre, et s’intègre bien dans le style moderne de Python.
Ce projet vous permettra de consolider vos compétences en Flask tout en apprenant à manipuler et afficher des données de manière efficace et claire.