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 en
    # faisant un join avec un espace " "
    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, mais comme on
# ne peut pas trier directement un set, qui n'a pas d'ordre,
# on convertit d'abor 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 voiture 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}")
Modifié le: dimanche, 5 mai 2024, 22:44