Files
1ereNSI/representation_construits/evaluation/TP04_Netflix_aide.md
Florian Mathieu 1290ccf453 ajout exercices, corrections diverses, glossaire
- Ajout des 10 TPs d'évaluation (sans PDF)
- Création GLOSSAIRE.md et AMELIORATIONS.md
- Corrections f-strings, eval(), sommaires

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 23:37:26 +01:00

5.7 KiB

Aide - TP04 Netflix

Rappels utiles

Differencier films et series

contenu = catalogue[0]

if contenu["type"] == "serie":
    print(contenu["saisons"], "saisons")
else:
    print("Duree:", contenu["duree"], "min")

Verifier si un element est dans une liste

genres = ["SF", "Action"]
if "SF" in genres:
    print("C'est de la science-fiction")

Joindre une liste en chaine

genres = ["SF", "Action", "Thriller"]
genres_str = ", ".join(genres)  # "SF, Action, Thriller"

Exercice 1

1.1 - Affichage formate

  • Films : affichez la duree en heures:minutes (duree // 60 et duree % 60)
  • Series : affichez le nombre de saisons et la duree moyenne par episode
  • Genres : ", ".join(contenu["genre"]) pour les separer par des virgules
def afficher_contenu(contenu):
    print(contenu["titre"], "(", contenu["annee"], ")")
    print("Genres:", ", ".join(contenu["genre"]))

    if contenu["type"] == "film":
        heures = contenu["duree"] // 60
        minutes = contenu["duree"] % 60
        print("Duree:", heures, "h", minutes, "min")
    else:
        print("Saisons:", contenu["saisons"])

1.2 - Statistiques

nb_films = 0
nb_series = 0
for c in catalogue:
    if c["type"] == "film":
        nb_films = nb_films + 1
    else:
        nb_series = nb_series + 1

Pour les genres uniques :

tous_genres = []
for c in catalogue:
    for g in c["genre"]:
        if g not in tous_genres:
            tous_genres.append(g)
genres_tries = sorted(tous_genres)

1.3 - Recherche par criteres

def rechercher(catalogue, type_contenu, genre, note_min):
    resultats = []

    for c in catalogue:
        # Verifier chaque critere
        if type_contenu is not None and c["type"] != type_contenu:
            continue
        if genre is not None and genre not in c["genre"]:
            continue
        if note_min is not None and c["note"] < note_min:
            continue

        resultats.append(c)

    return resultats

Exercice 2

2.1 - Temps de visionnage

def temps_visionne(hist, cat):
    total_minutes = 0

    for h in hist:
        # Trouver le contenu dans le catalogue
        contenu = None
        for c in cat:
            if c["titre"] == h["titre"]:
                contenu = c
                break

        if contenu == None:
            continue

        if contenu["type"] == "serie":
            total_minutes = total_minutes + h["episodes_vus"] * contenu["duree_moy"]
        else:
            total_minutes = total_minutes + contenu["duree"]

    heures = total_minutes // 60
    minutes = total_minutes % 60
    return total_minutes, str(heures) + "h" + str(minutes)

2.2 - Profil preferences

  • Comptez les genres ponderes par les notes utilisateur
  • Utilisez un dictionnaire {genre: score_total}
  • Triez par score decroissant
scores_genres = {}
for h in historique:
    # Trouver le contenu
    for c in catalogue:
        if c["titre"] == h["titre"]:
            for genre in c["genre"]:
                if genre not in scores_genres:
                    scores_genres[genre] = 0
                scores_genres[genre] = scores_genres[genre] + h["note"]
            break

2.3 - Gestion watchlist

def trier_watchlist(wl, cat, critere):
    # Creer une liste avec les infos completes
    avec_infos = []
    for titre in wl:
        for c in cat:
            if c["titre"] == titre:
                avec_infos.append(c)
                break

    # Trier selon le critere
    if critere == "note":
        avec_infos = sorted(avec_infos, key=lambda x: x["note"], reverse=True)
    elif critere == "annee":
        avec_infos = sorted(avec_infos, key=lambda x: x["annee"], reverse=True)

    # Renvoyer juste les titres
    titres = []
    for c in avec_infos:
        titres.append(c["titre"])
    return titres

Exercice 3 (Bonus)

3.1 - Recommandations similaires

def similarite(c1, c2):
    score = 0
    # Genres en commun
    for g in c1["genre"]:
        if g in c2["genre"]:
            score = score + 2
    # Meme type
    if c1["type"] == c2["type"]:
        score = score + 1
    # Meme decennie
    if c1["annee"] // 10 == c2["annee"] // 10:
        score = score + 1
    return score

3.2 - Recommandations personnalisees

  1. Calculez le profil utilisateur (genres preferes, note moyenne)
  2. Pour chaque contenu non vu, calculez un score
  3. Triez par score decroissant

3.3 - Soiree cinema

C'est un probleme d'optimisation (type "sac a dos") :

def soiree_cinema(cat, duree_max, genres_voulus):
    # Filtrer les contenus valides
    valides = []
    for c in cat:
        for g in c["genre"]:
            if g in genres_voulus:
                valides.append(c)
                break

    # Trier par note decroissante
    valides = sorted(valides, key=lambda x: x["note"], reverse=True)

    selection = []
    duree_totale = 0
    a_serie = False

    for c in valides:
        if c["type"] == "film":
            duree_c = c["duree"]
        else:
            duree_c = c["duree_moy"] * 3

        if c["type"] == "serie" and a_serie:
            continue  # Deja une serie

        if duree_totale + duree_c <= duree_max:
            selection.append(c)
            duree_totale = duree_totale + duree_c
            if c["type"] == "serie":
                a_serie = True

    return selection, duree_totale

Pieges a eviter

  1. Films vs series : les films ont duree, les series ont duree_moy et saisons
  2. Genre est une liste : utilisez in pour verifier si un genre est present
  3. Contenu non trouve : verifiez que le titre existe avant d'acceder a ses proprietes
  4. Tri stable : si deux elements ont le meme score, leur ordre relatif est conserve