Aller au contenu

🎬 Meilleurs films selon IMDB 🎬

Nous savons maintenant

  • ouvrir un fichier csv à l'aide de Python,
  • lire son contenu dans une liste (de listes ou de dictionnaires),
  • typer les données,
  • effectuer des requêtes sur ces données à l'aide de listes en compréhension.

Présentation des données et import

Nous allons pousser notre étude un peu plus loin lors de l'étude du fichier films.csv[^1]. Ce fichier reprend les 517 films les mieux notés sur le site Internet Movie DataBase (IDMB).

[^1]: Source sur Kaggle

Les descripteurs proposés sont :

Descripteur Indice Type Python Contenu
Ranking 0 int rang du film dans le classement
Name 1 str nom du film
Year 2 int année de production
Minutes 3 int durée (en minutes)
Genres 4 str genres associés (voir remarque)
Rating 5 float note moyenne(sur 10)
Votes 6 int nombre de votes
Gross 7 float revenus générés (en M$)

Les genres

Chaque film est associé à au moins un genre, certains à plusieurs.

Dans le cas où plusieurs genres sont cités, ceux-ci sont séparés par des virgules.

Voici les premières lignes du fichier :

📑 Données CSV
Ranking;Name;Year;Minutes;Genres;Rating;Votes;Gross
1;Citizen Kane;1941;119;Drama, Mystery;8.3;442770;1.59
2;The Godfather;1972;175;Crime, Drama;9.2;1849989;134.97
3;The Wizard of Oz;1939;102;Adventure, Family, Fantasy;8.1;400883;2.08

On importe les données sous la forme d'une liste de dictionnaires. Le code est le suivant :

import csv

films = []
with open("films.csv", "r", encoding="utf-8") as fichier:
    lecteur = csv.DictReader(fichier, delimiter=";")
    for entree in lecteur:
        entree["Ranking"] = int(entree["Ranking"])
        entree["Year"] = int(entree["Year"])
        entree["Minutes"] = int(entree["Minutes"])
        entree["Rating"] = float(entree["Rating"])
        entree["Votes"] = int(entree["Votes"])
        entree["Gross"] = float(entree["Gross"])
        films.append(entree)

Import réalisé !

Dans la suite de ce chapitre, la liste films telle qu'importée ci-dessus sera directement accessible dans les éditeurs.

Votes par genre

Le fichier compte 25 films dont l'un des Genres est Family, il en compte 26 avec le genre Horror. On précise qu'aucun film ne possède à la fois ces deux genres.

Activité 1 - Lequel de ces deux genres a reçu le plus de votes ?

Compléter le script ci-dessous afin de compter :

  • le nombre total de votes qu'ont reçus les films dont l'un des genres est Family (utiliser la variable total_family),

  • le nombre total de votes qu'ont reçus les films dont l'un des genres est Horror (utiliser la variable total_horror).

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013tClOH12/vyg.]swhuqUiV6P[dm0rA=7fbG) e:,8Rnp5(aSo3Fk_4+;cx050z0L0b0U0u0d0o0K0(0d0U0o0o0E010b0u0R010406050o0r0A0A0U0C0k040V0W0d0r0}0W0Q0K020U0A0R0%0K0P0L170C0s0r0L0o050i1416181a120R04051F1y1I0i1F120z0u0j0=0@0_0{0q0u0l0q0d1W0q0b10050-0H0d0L1R0^0`011V1X1Z1X0b1)1+1%0b0C1G0b0q0=1d0o0R0U0Q0{0h011-1T010G0/0L0Q1l0L1%23252a1/2d1+2g0A2i040a0K0x0C0W0R0W0o0u1g1i0+210C0C0L0(2D1y2k0Q1G0i1 2P1|1~1}1(0z2m0{1Z0Q2f2A1%1O1Q0?1.2Z0u2#0Q0W2)1%0R2I1G2N2P2`13241i2+2b2:0C170d100g2M2~112}2l301/3234100h38253a2N2Y013f0U35040X3j2O123m3d0{3p3r0#3u3l2~3n3A100S3D3w3F3y3o0W333q100w3K3b2 1S3e3P3g040F3U3x3X3z3Z3R040O3D1J2^1y2)2S0z1~2X3N0(2;2s0*1P1G2@0L2_393/3|0+443c3)3o100b0W0-0d0!0G1l0/0k3D0K3V3n0W100E4n4p3N0A0u100B3%3M4b0Q4d4f3q0!0q3P2x0C4u3(2,014r044t1z394o4O2b4x4z3K3L4a4P0Z100G3P4N4C4P4E042f1|0L0L4-4%2b0W0p102.4_3W4/4*0/0A1x4U3k4v4b0 040M3K0K5f4W4.2b4)040u0G503n0o2804021u4f0%0Y4k0d0k5t0r5v5o3N4|4~0Q5E4D104=2I4^572O594P5b0y3/4X1/5q105B5v0I2f2I0o5!0b0%5V5i1/5b0n5d5P115g5^5h4`3e4F4g4i5y4m5?5`514{100$4T2`633G5L0Q4?5O2|5W0{5T5-5{0{5Y5s5u5+0v4f1w5*5,5?5R2b5:5e5g6x1/5k0L1Z5n626C6m5r6u0f4K3P6u5J4P5G5l5I6I6h4c4;6d5N6k645/105U6w6X6n6u5$0Q5(6Q6+5.6i105;6A5_6a3N4:4e5~4J2H4,6W6@4Q66684V6J6Y5M4@6$3n6j6?6l016-6p0%6r0b6t7m7f3N6z5?120i47433:7z0i3?1y0b3^7E2V2Q0U1*7B3?1E496%0{2I0A5 0Z0L4I0X101q1s1u1w0K5=2|1L3a1F0e1i2@0W2d7p0K0u0(0u0K0z0r0K4j2C0K7$0K1+0;0+0r0)0K0l5%7%0o1h0b7@0Q3|1m0U0}7L0;0T0z250;0(0,7?1Z0o7?2F2o554o1r040U0K4x0Q0u171y8C0J0m1J7,1b7`0d001h0K8d0r0q0.7?8i242I0C7{0L87898b8r0W8j8l840N0K8U0z0W801f0/0u0o0L8(8688057y3n1;1Y1!1$7P3n5k5m3/7x3}040K0,0K240;0r1i943}961!1?1#2j769d6H697b4R0m9D6R5j5L6G9f7y040m0K0c001w8f1+0=0^9l189j0)1r0R9S0U0j2J837%8a6:7%9q480D0z9%6d0r2I1y9K9j8f9.435x4x5z9_9h8O1N1P3n252:0-7?979u9a1H3;7*2|9K7b6 4G4h0U9;4=9@6f7a6X4R793k6}4b4Z044A7vak5}4H4ja0619Aau4s9F1/aAaC2`064$7Q015k4+4M757j4:7dasax9B4}6UaN3z530d557s5a107)39065^7b9ya,7k6L7m9:9=0bar6=aK766T4 aZaUa#6!7e7iaU7h6g767l5C5+6/6;7rbf7g6_a@3ka_6|ay5204704Haob2ara}4R67a}bc6ea;5S6)bL2bbk5v7o7qbl6vbi7j7uaRa`6Xa|ba5pa bU9 4lb5atb7a*b9b6a!6cbKbq7tbNb_4bbQbm8-b-586X5:bt2O5f7b0(0g10030K0T0g0J6{5_aEbzam5 aIbF78bIb@6#b|bM046*bWaUb~7n6s5)bpcxbr040n3U9g487A2P7N051d3a1Z040t1i8 3|0Q2X9}9s1=999w7jb$7*9`0U7}1Z8*7{009o4o953Nacc$9b3N6E9I6wcJ7BcR7wcP7w0+0-0/0o04.

Projection(s)

Pour obtenir la liste des noms de films, on peut procéder ainsi :

>>> [entree["Name"] for entree in films]
['Citizen Kane', 'The Godfather', 'The Wizard of Oz', 'The Shawshank Redemption', 'Pulp Fiction', ...]
Activité 2 - La fonction projection

On souhaite écrire une fonction projection qui :

  • prend en argument la liste de dictionnaires à manipuler ainsi que le nom d'un descripteur,

  • renvoie la liste ne contenant que les valeurs associées à ce descripteur.

Compléter le code ci-dessous en saisissant la fonction projection telle que décrite.

Attention, les résultats doivent être dans le même ordre que dans la liste initiale.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013rt=flb)1 2e/vygj:,]swRnuph(aSo3qkiP;[cdm050N0l0c0C0I0f0u0j0M0f0C0u0u0d010c0I0z010406050u0y0O0O0C0b0o040D0E0f0y0)0E0x050m0:0=0@0_0.0z040519121c0m190.0N0I0n0X0Z0#0%0A0I0p0A0f1q0A0c0,050S0g0f0l1l0!0$011p1r1t1r0c1z1B1x0c0b1a0c0A0X0|0u0z0C0x0%0k011D1n010e0U0l0x0C0O0l1x1W1Y1%1F1*1B1-1/0,0a0j0J0b0E0z0E0u0I0 0x0j0Q1U0b0b0l0M27121=0x1a0m1S2k1P1R1Q1y0N1@0%1t0x1,241x1i1k0Y1E2u0I2w0x0E2A1x0z2d1a2i2k2O0/1X282C1(2H0b0?0f0,0i2h2S0-2R1?2U1F2W2Y0,0k2$1Y2(2i2t012-0C2Z040F2;2j1d2M122A2n0N1R2s2+0%0M2I1:1a341b322Q132%053b0Q2N2S2^0H0,0Q0e2 040j2)2T1m2,0e0,2L0E0q2e2g3j2=3y2^0+040B3v3L392_3s102w0l0u3Q2@3S3N0s3v3x3!3A0%0x3s3X0M0b0*0c0l0y0b3Z3p3#0,0h0r3v0.3*2D010v0,0j473x3J30421(0u0N0,020G0y0E0c0K4h4j4l4n4k0K0w1,0n0E0I1C0Z0j1t0u3?293X0j0n2{3@0b0W2a0M1C0Q0u3:3=4J4q4p4i4r4U0K40483)3{3+013r042d0c3^114a3w3R4(3N0L3`2*4(3-041,1P0l0l4_3z434@522^4|4P4R0z3?3^563|040t3(4=434*0e0E3_4:4$4`434|4~2d515p5j1(0E45042F5i4c2,3U0x3W3Y4:5y1F3N5h4:0.0m3m0l2k2L5U331j352n2q2l0C1A5X0m345R0Q0S0U0u04.
Activité 3 - La fonction projection_multiple

On souhaite désormais récupérer les données associées à plusieurs descripteurs : la fonction projection_multiple prend en argument la liste des données et un tuple contenant les descripteurs à conserver.

Par exemple projection_multiple(films, ("Name", "Year", "Rating")) renverra la liste des tuples formés du nom, de l'année de production et de la note de de chaque film.

>>> projection_multiple(films, ("Name", "Year", "Rating"))
[('Citizen Kane', 1941, 8.3), ('The Godfather', 1972, 9.2), ('The Wizard of Oz', 1939, 8.1), ...]
Aide

Nous avons vu comment créer des listes en compréhension. Il est aussi possible de créer des tuples en compréhension :

>>> tuple(2 * k for k in range(3))
(0, 2, 4)
>>> [tuple(k * lettre for k in range(3)) for lettre in "ab"]
[('', 'a', 'aa'), ('', 'b', 'bb')]

Compléter le code ci-dessous en saisissant la fonction projection_multiple telle que décrite.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013rt=flb)1 2e/vygj:,]swRnuph(aSo3qk_iP;[cdm050O0l0c0C0J0f0u0j0N0f0C0u0u0d010c0J0z010406050u0y0P0P0C0b0o040D0E0f0y0*0E0x050m0;0?0^0`0/0z04051a131d0m1a0/0O0J0n0Y0!0$0(0A0J0p0A0f1r0A0c0-050T0g0f0l1m0#0%011q1s1u1s0c1A1C1y0c0b1b0c0A0Y0}0u0z0C0x0(0k011E1o010e0V0l0x0C0P0l1y1X1Z1(1G1+1C1.1:0-0a0j0K0b0E0z0E0u0J100x0j0R1V0b0b0l0N28131?0x1b0m1T2l1Q1S1R1z0O1^0(1u0x1-251y1j1l0Z1F2v0J2x0x0E2B1y0z2e1b2j2l2P0:1Y292D1)[email protected]@2V1G2X2Z0-0k2%1Z2)2j2u012.0C2!040F2=2k1e2N132B2o0O1S2t2,0(0N2J1;1b351c332R142(053c0R2O2T2_0H0-0R0e30040j2*2U1n2-0e0-2M0E0q2f280I0P0y0f0*0z1C3w3z2_0,040B3R2^3a2`3t112x0l0u3X3q3Z3U0s3w3y3Y3B0(0x3t3(0N0b0+0c0l0y0b3)3k2?3S3,0-0h0r3w0/3;2E010v0-0j4g3y42314b1)0u0O0-020G0y0E0c0L4q4s4u4w4t0L0w1-0n0E0J1D1C0X0n2|3~402a1D0N3(4O0u3`3|4M0u4z4y4r4A4Y0L494h3:3+3=013s042e0c3 124j3x444,3U0M3*2+4,0x0g0-4;3P0l4}3A4c3U3W4@4_4c3@041-1Q0l555b4l1G4{562_5e0O5o45040t3/5c1)4.0e0E0b5w5l3?3t5D4+4c0E4e042G5H4~5d3^4T3{0z3}3 412R5E013U0h5O575y0-5A5C4@4*5P2W0-5g2e5j2P5.5(1G5K0-5N5-5x2-3#0x3%5X3l5Z3U5v4@0/0m3n0l2l2M6e341k362o2r2m0C1B6h0m356b0R0T0V0u04.

Sommes et moyennes

Quel est le montant total rapporté par l'ensemble de ces films ? Et le montant moyen ?

Pour le savoir il faut dans un premier temps additionner les revenus générés.

Activité 4 - La fonction somme

Compléter le code ci-dessous en saisissant la fonction somme qui :

  • prend en argument la liste de dictionnaires à manipuler ainsi que le nom d'un descripteur,

  • renvoie la somme de toutes les valeurs associées à ce descripteur.

Remarque

Vous observerez que l'on ne teste pas la stricte égalité des résultats car les valeurs manipulées sont des flottants et qu'il y a des erreurs d'arrondis.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013rt=flb)I1 2e/vygj:,]swRnuph5aS(oq3k_i4+6;P[cdxm0050T0m0c0D0L0f0v0k0S0f0D0v0v0d010c0L0A010406050v0z0V0V0D0b0p040E0G0f0z0;0G0y0k020D0V0A0P0k0x0m0~0b0H0z0m0v050n0{0}0 110_0A04051w1p1z0n1w0_0T0L0o0)0+0-0/0B0L0q0B0f1N0B0c0@050!0g0f0m1I0,0.011M1O1Q1O0c1W1Y1U0c0b1x0c0B0)140v0A0D0y0/0l011!1K010e0$0m0y1c0m1U1`1|211$241Y270V29040a0k0Q0b0G0A0G0v0L17190Y1^0b0b0m0S2u1p2b0y1x0n1?2G1:1=1;1V0T2d0/1Q0y262r1U1F1H0*1#2Q0L2S0y0G2W1U0A2z1x2E2G2.0`1{192Y222%0b0~0f0@0j2D2=0^2;2c2@1$2_2{0@0l2 1|312E2P01360D2|040I3a2F0_3d340/3g3i0M3l3c2=3e3r0@0C3u3n3w3p3f0G2`3h0@0O3u1A2,1p2W2J0T1=2O3E0S2(2j0X1G1x2+0m2-303L3V0Y3%331J1$0J0@0Y0e3u0k322?3.3q0e0@0v0G0}0m3L3o3{010?040F433D450y3;182S1n4a3-2Z460@0t3@3_3x3;1n0S0b0=0c0m0z0b4i3`4k470h0s3B4p3E0w0@0k4L3^1q3(444k0v0T0@021l0G0c0P4V0z4X4Z4W4Y1h0y0o0G0L1Z0+0k3 410k0Y0(0o3h4x0b0(2w0S1Z4^4t4v4|4!4$564Y580P3B4M3^4Q2^0@0c4X3h4o5f1$0G0@0d5l4b4k0V0L0@0W5c4M4H453:040e3G5r4j5g04261:0m424O3b5e5s220G4J042#5G4B5I0T4f5M1o5O2F5A4C0@4F5(0^5d5d5*5I5i0!0f5X3e5o040N5q5.5Q5H350@5K2z5N2:5m0/470R4A4q04524u0A4w4y6d3E470u5y4L5=3/0@2z0c4y0y5`[email protected]_0n3*3$3M6I0n3P1p0c3R6N2M2H0D1X6K3P1v3,5Y1$2z0V0K0e0D0J0m0K0B0I0@1h1j1l1n0k5-2:1C311w0i0f0k0m0U0L0v4w0k0A152s4|0(3 152u0(3h4w0b270;0o6?5-1D050z0f311Q040D7k0S0k4:5E0y2B0L183^6H042+0G0r2A2C6G3W046@1p7s6F7p312W3e1(1P1R1T3!3N6_2:7F6r0/5C3=6y4c3}044=2i6l4547495.7*3f4e0y4g5%685R1$474n607|6A6g546k7{694l044E4G8e5U5;8d830/4S4U4(4%4#598r4*4,4.7x0D4;402i4@6?4`1Y4y4~1Z508E0v536i558r5a5a6p616Z3q5h5j5_878e5|5 2.8V3e5u5w8U7|5C5E4z8#8n7}048G4|7.4k5T0@5W8?628X7G2o7J7B187@5+48995Z5#4h8m928f868)884r8N6h6j8=829h4D6^30065:5z8e6A6C8!9k8$0@5~8|5I8`8c2.9w9y8@5C6u6w9H636B8Z4G7M3+6J2G6W7o7q0_7s7u2A8z0k7z9719057F1r1p7F8E2m0p1?7D5-7R1p7T1E1G7W1R1*1S2*7$3(7{7)8e7,0m3?918W3f7:7=674P8@7_9c9T5!7 5$aq6a4m9S938a8P9Kan9s0@8h6E7|8k5z9gai8p048S8R8v268x4/8Aal8M0k9J4}9_8LaA9paP8t8s4$8.ad6t0Z9Rah3x0g3~0|av8f0F6caL6e655Ma`6ba`894s9o8{a~6m0@6oa=3E8:5Fbd4c640y5Lam5P7|8~5V6xbh4k899e81aDai6n0h9W7)1C3N6L3Z0_a1059)7v9,9.2u7E7N7H967L9^0ZbM189/bP3+9?9X3$7P0n9 0nbI7V3E7Xa67!1ya93b3)7N8/4rag9D8@0yak8Cbm5)8eapb9bi6fbvb2axbs5Zb68b9qbx3e9t8i8@aJ6qc64R4TaOaQa*5a8w4-aU8B4?4^aY4{8Ia#51ceaB0ba)578ra-9Oa/6v7hay3fa@7;a_co22c59rai6AbR7K7CbrcZci0@7`c*6z7~80ca049j308*c/6fcG9pc=0hbAaHb$2G3#9!bG3O0Z0#0%04.

Il est désormais possible de calculer la moyenne des valeurs d'un descripteurs. Là encore, écrivons une fonction pour cela.

Activité 5 - La fonction moyenne

Compléter le code ci-dessous en saisissant la fonction moyenne qui :

  • prend en argument la liste de dictionnaires à manipuler ainsi que le nom d'un descripteur,

  • renvoie la moyenne de toutes les valeurs associées à ce descripteur.

Remarque

Une version de la fonction somme précédente est fournie. Vous pouvez l'utiliser dans votre code.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013rt=flb)1 2e/vyg:,swRnuph(aSo3qkiP;cdm050K0l0c0A0G0f0s0j0J0f0A0s0s0d010c0G0x010406050s0w0L0L0A0b0o040B0C0f0w0$0C0v050m0-0/0;0?0+0x0405160 190m160+0K0G0n0U0W0Y0!0y0G0p0y0f1n0y0c0)050P0g0f0l1i0X0Z011m1o1q1o0c1w1y1u0c0b170c0y0U0_0s0x0A0v0!0k011A1k010e0R0l0v0A0L0l1u1T1V1!1C1%1y1*1,0)0a0j0H0b0C0x0C0s0G0|0v0j0N1R0b0b0l0J240 1/0v170m1P2h1M1O1N1v0K1;0!1q0v1)211u1f1h0V1B2r0G2t0v0C2x1u0x2a172f2h2L0,1U252z1#2E0b0:0f0)0i2e2P0*2O1:2R1C2T2V0)0k2Z1V2#2f2q012*0A2W040D2.2g1a2J0 2x2k0K1O2p2(0!0J2F1-1731182 2N102!05380N2K2P2=0F0)0N0e2|040j2$2Q1j2)0e0)0L0C0o1)2t3s3v2=0(040z3G2;362?3p0}2t0l0s3M3m3O3J0r3s3u3N3x0!0v3p3T0J0b0%0c0l0w0b3V2%3%013J0h0q3s0+3$2A010t0)0j443u3g2/3H3O0s0K0)020E0w0C0c0I4e4g4i4k4h0I0u1)0n0C0G1z0W0j3B3D0v2t263T0j0n2^3:0b0T270J1z0N0s3,3.4H4n4m4f4o4S0I3}453#3W3^3o042a0c3;0~472g4!3@403)040s0C0/0l3?3w403J3L4-3l4:2S3Q4A0l3T4{3I0)3Z504/4|53044N4P0x3/3;583X0)0h3!493^0C0)0m5q3 2S0g0)1@5m3^4~5C4;543S3U505r4}5o3}0 3j0l2h2I5R301g322k2n2i0A1x5U0m310+5(0O0Q0S04.

La fonction moyenne est donc valide. Pourtant l'appel moyenne(films, "Gross") renvoie un résultat faux !

En effet, pour certains films le revenu total est inconnu. Néanmoins, afin de proposer un fichier csv valide, sans valeurs manquantes, la valeur -1.0 a été ajoutée dans ce cas. C'est le cas par exemple pour le 19ème film du classement (« Les 400 coups » de François Truffaut) :

>>> projection_multiple(films, ("Name", "Gross"))[18]
('The 400 Blows', -1.0)
Activité 6 - Calcul du revenu moyen des films

Calculer le revenu moyen des films proposés. Il ne faut pas tenir compte des films pour lesquels cette valeur est inconnue (-1.0 dans le fichier).

Votre variable contenant la bonne valeur doit s'appeler moyenne_valide afin de pouvoir passer les tests avec succès.

Les fonctions somme et moyenne sont déjà chargées.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013rt=flbG)1 2e/vyg,]swnuph(aSo3qk_iP;[cdm0050M0m0c0A0H0f0t0k0L0f0A0t0t0d010c0H0x010406050t0w0N0N0A0b0p040B0C0f0w0)0C0v050n0:0=0@0_0.0x040519121c0n190.0M0H0o0X0Z0#0%0y0H0q0y0f1q0y0c0,050S0g0f0m1l0!0$011p1r1t1r0c1z1B1x0c0b1a0c0y0X0|0t0x0A0v0%0l011D1n010e0U0m0v0A0N0m1x1W1Y1%1F1*1B1-1/0,0a0k0I0b0C0x0C0t0H0 0v0k0Q1U0b0b0m0L27121=0v1a0n1S2k1P1R1Q1y0M1@0%1t0v1,241x1i1k0Y1E2u0H2w0v0C2A1x0x2d1a2i2k2O0/1X282C1(2H0b0?0f0,0j2h2S0-2R1?2U1F2W2Y0,0l2$1Y2(2i2t012-0A2Z040D2;2j1d2M122A2n0M1R2s2+0%0L2I1:1a341b322Q132%053b0Q2N2S2^0v0,2d0o1,0w0t0G0o2{0H0Q0t2 040k2)2T1m1F0C0,0d3E3G2@39010+040K3E3H3q0,1,1P0m0m3O3X3R0F0,0e0C0b3(3Q3J0%3r043!2d3%3j2=3P3p3R0C0u0,2F3:3 3=2_3,0U0N3D3|2j3~2*473+040H0e454g2D483^0v3#3{2Q3;4o3T3V4d3o4n1(0t1#04020E0w0C0c0J0h210#4G4I4K3W4v1(3T0s4m3I4o3L4F0q4R4z4f4Y1(0N0H0,0O4S464w0,4W4z060.4T2,0,0N0C0p1,2w3y3A0Q4X2^4!3N4(3)473@4~500v2w4:4B1F3T0z5i4*4|043t3v3x3z1t3C5n2^3T0r563R4D0,4P4J4L4N0t5F4%4u4;4U0,0i3E0.0n3m0m2k2L5V331j352n2q2l0A1A5Y0n345S0Q0S0U0t04.

La meilleure année ?

Quelle année a vu se produire le plus de films présents dans ce classement ? Nous allons compter le nombre de films produits chaque année.

Une approche naïve consisterait à effectuer de nombreuses requêtes, une par année : « quels sont les films produits en 1900 ? », « quels sont les films produits en 1901 ? », etc.

Cette approche présente plusieurs inconvénients :

  • quelles sont les années à chercher ? On a fait l'hypothèse que les films ont été produits à partir de 1900 mais c'est vraisemblablement incorrect...

  • Python doit lire l'ensemble des données à chaque requête ! Donc 100 lectures des 517 films si l'on teste tout le XX-ème siècle...

Une approche plus efficace consiste à utiliser un dictionnaire dont les clés sont les années et les valeurs le nombre de films produits cette année-ci. On peut procéder ainsi :

  • initialement le dictionnaire est vide,
  • on parcourt l'ensemble des films. Pour chacun :
  • si son année de production n'est pas présente dans le dictionnaire, on l'ajoute (en tant que clé) avec la valeur 1 (c'est la première fois que l'on rencontre cette valeur)
  • si l'année est déjà dans le dictionnaire on incrémente simplement la valeur associée.
Activité 7 - Films par années

Compléter le script ci-dessous permettant de compléter le dictionnaire annee_films associant à chaque année présente dans la liste des films le nombre de films produits cette année-ci.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013rt=7flOb)1 {2e/vygj:,]swRnuph5aS(oq3Y}_ki4+6;P[cdm050X0o0c0F0P0g0x0l0W0g0F0x0x0d010c0P0C010406050x0B0Y0Y0F0b0r040G0I0g0B0?0I0A0l020F0Y0C0T0l0z0o100b0J0B0o0x050p0}0 11130{0C04051y1r1B0p1y0{0X0P0q0+0-0/0;0D0P0s0D0g1P0D0c0_050$0i0g0o1K0.0:011O1Q1S1Q0c1Y1!1W0c0b1z0c0D0+160x0C0F0A0;0n011$1M010f0(0o0A1e0o1W1|1~231(261!290Y2b040a0l0U0b0I0C0I0x0P191b0!1`0b0b0o0W2w1r2d0A1z0p1^2I1=1@1?1X0X2f0;1S0A282t1W1H1J0,1%2S0P2U0A0I2Y1W0C2B1z2G2I2:0|1}1b2!242)0b100g0_0k2F2@0`2?2e2_1(2{2}0_0n311~332G2R01380F2~040K3c2H0{3f360;3i3k0Q3n3e2@3g3t0_0E3w3p3y3r3h0I2|3j0_0S3D342^1L373I39040e3w1C2.1r2Y2L0X1@2Q3G0W2*2l0Z1I1z2-0o2/323W3*0!3=353Q3s0_1~2U0o0N2h0Y1q1s320l3O3g0I0_0d3w483q3|010^040m0M3D3E3{2#010O0_0f3I4e493G0A0_281=0o0o4w4g4q0I0y0_2%4F3F4h4z0443452=4G244j0u3D0l4Z4f4N4q4s040P0f4M4p2`4A0A4C4E463d4x4h4j0V3W4U1(0x2104021n0I0c0T0L0o11520B540T4|4$4V0_0w4,3P4H4J042)0c5j4a5m4L4?2H4#4-373~0A40420(445e5x0;4W4Y4!5K4^4q4P3 4D5C0g5E5u3`5k5g044{5U5M4.044B2B4=4T5f1(4`5F5W4~505a5c575953555/3g4j0w5i5U5w5:0;4b044d615#1(0Y0P2 5J4Z690;4(0o0)5*3?4}5H0_4X5U065K5L6n3h5z5B4R5|3G5.5!6v4P5(4D6A4_0_5Z5+5G014 0_5?555^0b6R5d6D5,6o045 5q3G650R672:623g6b6d6r1r3^3;3X6?0p3!1r0c3$6{2O2J0F1Z6^3!1x5V3g2B0Y420F0O410D0K0_1j1l1n1p0l6q2=1E331y0h1b2s0B2A0%0c0l0F0B0/0P0l180(0P0x0o0b0l0-0l4u0A2D0P1a486=042-0I0t2C2E0p7T7l1C332Y3g1*1R1T1V3/3Y7n2=7T6g6w045P416z686v656*477@4j4l4n7@4(4u0b6$4O6x6H7}6Y014I4K0A8a5N0_7V7X7P1a6I4q4j0H8r5$7|6M634i0_0v8k246P515`56586U8H8v5-0_0j7m326s4!864K4+8e6N5O5A8d6+7@8h5n548D1(8(5t8$6E8c7{5D4S6m8f5I6r6t8T8:7_8!8=5S8@4@6v6C8y3z8;8M6Z608/8f7 8+0;6.04308{8}8f6i6k9a8A048Q3d8S8|7@8Z6y8?9q968^8Y996X6N5~9g8g0_6)9J9i9k2:0{7!3+2I3:2I743Z0#0%0)04.

Il reste à déterminer l'année durant laquelle le plus de films ont été produits.

Activité 8 - La meilleure année

On a chargé en mémoire le dictionnaire annee_films associant à chaque année le nombre de films produits cette année-ci.

Déterminer l'année (nommée annee_maxi) durant laquelle le plus de films ont été produits.

Pas d'égalité !

Une année sort du lot, il n'y a pas d'ex-aequo.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013rt=7flOb)1 2e/vyg.:,]swRnuph5aS(oq3Nk_i46;P[cdxm0050U0n0c0E0N0g0w0l0T0g0E0w0w0d010c0N0B010406050w0A0W0W0E0b0q040F0H0g0A0=0H0z0l020E0W0B0Q0l0y0n0 0b0I0A0n0w050o0|0~10120`0B04051x1q1A0o1x0`0U0N0p0*0,0.0:0C0N0r0C0g1O0C0c0^050#0i0g0n1J0-0/011N1P1R1P0c1X1Z1V0c0b1y0c0C0*150w0B0E0z0:0m011#1L010f0%0n0z1d0n1V1{1}221%251Z280W2a040a0l0R0b0H0B0H0w0N181a0Z1_0b0b0n0T2v1q2c0z1y0o1@2H1;1?1=1W0U2e0:1R0z272s1V1G1I0+1$2R0N2T0z0H2X1V0B2A1y2F2H2/0{1|1a2Z232(0b0 0g0^0k2E2?0_2=2d2^1%2`2|0^0m301}322F2Q01370E2}040J3b2G0`3e350:3h3j0O3m3d2?3f3s0^0D3v3o3x3q3g0H2{3i0^0P3C332@1K363H38040e3v1B2-1q2X2K0U1?2P3F0T2)2k0Y1H1y2,0n2.313V3)0Z3;343P3r0^1}2T0n0M0 0V0N3v0l3N3f0H0^0d45473F0L0T0^0K190n3M3p3{3g0^42441r31464m2!0149044b4s3c4u3E4n0W0N0^0X3C3D3`4w0L0^0f3H4c4v2_3}0z3 4S4E4w0H0x0^2$4Y4M4U043~0n402g0W1p4B2G4d4n0@040t3C0l4~4D4*1%4O040N0f4)3O4w0z4V3 0M4:4=2;4T1%4`0S3V5h3|4,4W4.5l4Z234`0v57480^020r0c0Q5w3F5a044q5r510:4`4|4?0_4 5P50584+5H5N5R5x4z5D4n5F4-4/0%4;5I5S5i0^5k5N4^595b5q5/5m015u4}5Q4~5:4+5$410E435Z4!4a645 5p4k5N0`0o3@3:3W6f0o3Z1q0c3#6k2N2I0E1Y6h3Z1w3_5+0:2A0W5d0E0L400C0J0^1i1k1m1o0l5M2;1D321x0h1a2r0A2z0$0c0l0E0A0.0N0l1|0b3)6U0N0b0l1Z0)051j540c1j4=6=0l0U0A6{0N2C0N19286,1!5M1E3,2Y4n1)1Q1S1U3.3X6N2;6e6v3y5=405U2/5W3F4y4A7p5~524g044i2T4l5s364p624r7u5^7s671%4G4I4K7v0:534Q0b7K5n5$5*3f4`0u7U4o042(0W0i2A7#4#4%0z7#5#695d5(5f3=7I0^0s7X5E4%6@5)5@7C5K0^0G0j6M31065P7P0153557:0^7(7*6a7H834x5y5A5C5V8c5F7o7_8m5L5{5|8s7E638r7`5Y8D8m5F8i7+6b5|5}5^7;5c8u4C8c7J8G5J7$7W6b1q7j6g2H6t3Y0!0$0(04.

Le meilleur genre ?

Quel genre de film est cité le plus de fois ? Facile, il suffit de compter les apparitions de chaque genre comme l'on vient de compter les années.

Mais les genres sont mal présentés : chaque film est associé à un, deux ou trois genres, si besoin séparés par des virgules, avec des espaces derrière les virgules...

>>> films[3]["Genres"]
'Drama'
>>> films[4]["Genres"]
'Crime, Drama'
>>> films[5]["Genres"]
'Drama, Romance, War'
Activité 9 - Détermination du genre le plus représenté dans les films

La variable contenant ce genre sera nommée meilleur_genre

Astuce

On rappelle que la méthode str.split découpe une chaîne de caractères à chaque apparition de l'argument et renvoie la liste des chaînes obtenues.

Par exemple "31/5/2007".split("/") renvoie ['31', '5', '2007'].

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : 5/5

.128013rt=7flbG)1 {2e/vygj.:,]8sw9nuph5aS(o3qN}_ki4+6P;[cdxm0050Z0o0c0H0R0g0z0l0Y0g0H0z0z0d010c0R0E010406050z0D0#0#0H0b0r040I0K0g0D0`0K0C050p111315170 0E04051n1g1q0p1n0 0Z0R0q0/0;0?0^0F0R0s0F0g1E0F0c0}050*0h0g0o1z0=0@011D1F1H1F0c1N1P1L0c0b1o0c0F0/1a0z0E0H0C0^0n011R1B010f0,0o0C0H0#0o1L1.1:1^1T1{1P1~200}0a0l0V0b0K0E0K0z0R1d0C0l0(1,0b0b0o0Y2l1g230C1o0p1*2y1%1)1(1M0Z250^1H0C1}2i1L1w1y0:1S2I0R2K0C0K2O1L0E2r1o2w2y2$101/2m2Q1_2V0b140g0}0l0k2v2*0~2)242,1T2.2:2=0n2^1:2`2w2H012 0H2;040l0L332x0 362}0^393b0l0S3f352*373l2=0G3p3h3r3j380K2/3a2=0U3w2{2+1A2~3B303c0e3G3i3J3k3L3D3c0y3P3y3R3A3C3m0B3X2|3Z3t040k0$3(3I2R3!3M0k2@1h2_3x3)3;3+0k323_343{3:2-3T3b0k3e413g3H3s460}0k3o4a2y2Z0o2y2O2B0Z1)2G3z0Y2W211o4n1p2!3H2%2_054t0(2#3Y3}0}1w4t0P0s1}2r0z3p0l4c3z0K0}0d4R4T3Z0|040m0O3/3s0}200,1P0D0b4M4O0o4Y3Q3;4V044X4i4S4^1_0Q0Y0}0N1e4?4i434*04140!0R4@4H1_4`4|2$4~5f1T0#0R0}3.57583z0Q0}0f3B5e3|2-0}4N0C4P5y441T0K0A0}2T5F592Z0K0t2s2u4i4Z3;4#0J3p5U5A04270#4Q5T4 1T4#0w5M3z0z1?04020M0D0K0c0W0i4=0z5?5^5`5Y5*0^4#0j0v3w0l695k5z2~0}0z0K0D0z4;5D0o5(5j5Z5H4W5.3*5B5}625l0^4`0u6v6c3k6e0E1H0c6A5G640}5X5)6w015:0}5 5_0W0w0l6R616M6B0165686a6o0^5u5#5x4}6(386t6k6r4_5J045L6-636/046f6h6j5E6Y6I6!0}67576a786b736*0R0f6=5!5C2r7f5H6@2V6G6`6N5I5K1f7o6Z0C4J0R4L7h6l6H374#762$06797H7a594K0K707A727C0}0X7B3z7v047z7T4!0}0x7j6x6q7t735n4f6$7H6.6*0o0-562(6{7D7-7I696.7V7L7N6m4C7^7R7Y4I7W4=851_4#7#7)374`0T5i2_7J3z7+3,7`787/5K7e8d7U7w7y6u7P3z4#7S8x6s876;8B5V7!7$014`020s6X6n6{7V5b5d8F8a758n7I7}4+0o4-0o4/7N8I5h8I7V7X777{6%8P4+0H5c8)7(8O6N7~7x7M7z81346.8z896d5a8!0g4.4:8-7@6N8b3G0p4E4l1r4z0p4x2z4p1g2C9p0H1O9i9l1x2`9l0)0+0-04.