Code:


from dataclasses import dataclass

# Exercice 1 (b)
with open("cars.txt", "r", encoding="utf-8") as file:
    contents = file.read()

# on split le fichier en lignes, \n est le séparateur
lines = contents.split("\n")

# Exercice 1 (c)
# modélisation d'un type de voiture
@dataclass
class Car:
    brand: str
    model: str
    cylinders: int
    weight: float
    origin: str

# Exercice 1 (d)
# la liste dans laquelle on va stocker les voitures
cars: list[Car] = []

for line in lines[2:]:
    # on split la ligne en colonnes
    parts = line.split(";")
    # on extrait le nom de la marque: on split avec les espaces et on prend le premier élément
    model_parts = parts[0].split(" ")
    brand = model_parts[0]
    # pour le nom du véhicule, on prend le reste et on le remet sous forme de chaine de caractères
    model = " ".join(model_parts[1:])
    # conversion des autres champs en int et float
    cylinders = int(parts[2])
    weight = float(parts[5])
    # on a converti ce qui devait être converti; on peut donc maintenant créer la voiture
    car = Car(brand, model, cylinders, weight, parts[8])
    # on l'ajoute à la liste
    cars.append(car)

# affichage de toutes les voitures
for car in cars:
    print(car)

# Exercice 2
# on collecte toutes les marques dans un set pour éviter les doublons
brands: set[str] = set()
for car in cars:
    brands.add(car.brand)

# on trie le set pour avoir une liste ordonnée
# comme on ne peut pas trier directement un set, qui n'a pas d'ordre,
# on convertit d'abord le set en liste
sorted_brands = sorted(list(brands))

# écriture du fichier de sortie
with open("brands.txt", "w", encoding="utf-8") as file:
    # boucle à travers toutes les marques
    for brand in sorted_brands:
        # on compte les voitures qui sont de cette marque
        num = 0
        for car in cars:
            if car.brand == brand:
                num += 1
        # on écrit la marque et le nombre suivi d'un retour à la ligne
        file.write(f"{brand} ({num})\n")

# Exercice 3 (a)
# on repère les origines dans un set, comme pour les marques
origins: set[str] = set()
for car in cars:
    origins.add(car.origin)

for origin in origins:
    # pour chaque origine, on collecte les marques dans un set
    brands = set()
    for car in cars:
        if car.origin == origin:
            brands.add(car.brand)
    # on construit une représentation sous forme de string des marques après avoir trié le set converti en liste
    brands_str = ", ".join(sorted(list(brands)))
    print(f"{origin}: {brands_str}")

# Exercice 3 (b)
# on collecte dans ce dictionnaire, pour chaque clé qui représente
# le nombre de cylindres, la liste des poids des voitures correspondantes
weights_by_cylinder: dict[int, list[float]] = {}
for car in cars:
    # si le dictionnaire n'a pas encore de clé pour ce nombre de cylindres, on l'ajoute avec initialement une liste vide de poids
    if car.cylinders not in weights_by_cylinder:
        weights_by_cylinder[car.cylinders] = []
    # on ajoute le poids de la voiture à la liste correspondant au nombre de cylindres de la voiture
    weights_by_cylinder[car.cylinders].append(car.weight)

# on trie les clés du dictionnaire pour avoir une liste ordonnée des valeurs des cylindres
sorted_cylinders = sorted(list(weights_by_cylinder.keys()))
for cylinders in sorted_cylinders:
    # on récupère la liste des poids correspondant au nombre de cylindres
    weights = weights_by_cylinder[cylinders]
    # on calcule la moyenne des poids
    total = 0.0
    for weight in weights:
        total += weight
    avg_weight = total / len(weights)
    # on affiche le nombre de cylindres et la moyenne des poids
    print(f"Poids moyen pour {cylinders} cylindres ({len(weights)}): {avg_weight}")
Last modified: Friday, 27 March 2026, 6:13 PM