# Aide - TP04 Netflix ## Rappels utiles ### Differencier films et series ```python 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 ```python genres = ["SF", "Action"] if "SF" in genres: print("C'est de la science-fiction") ``` ### Joindre une liste en chaine ```python 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 ```python 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 ```python 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 : ```python 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 ```python 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 ```python 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 ```python 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 ```python 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 ```python 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") : ```python 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