🎬 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 CSVRanking;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
).
.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.
.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.
.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.
.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.
.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.
.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.
.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.
.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']
.
.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.
# Tests
(insensible à la casse)(Ctrl+I)