🐻 Meilleurs films selon IMDB
À ce stade nous savons :
- 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. Ce fichier reprend les 517 films les mieux notés sur le site IMDB.
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 à trois genres...
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 toute la suite du TP, la liste films telle qu'importée ci-dessus sera accessible dans chaque éditeur.
Votes par genre
Le fichier compte 25 films dont l'un des Genres est Family et 26 avec le genre Horror. On précise qu'aucun film ne possède ces deux genres.
Parmi ces deux genres, quel est celui qui a reçu le plus de votes au total (en additionnant les votes reçus par chaque film) ?
Comparaison de genres
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).
.128013,]xFa/cP_Ai;y(25GqeU78VOpHv1)0f+:gS.C3morhdwtsRl4k [n6=ub050R0t0T0f0l0W0U0Z0h0W0f0U0U0%010T0l0z010406050U0(0N0N0f0P0n040J0O0W0(0}0O0#0Z020f0N0z0m0Z0V0t170P0s0(0t0U050g1416181a120z041y1F051I0g1I1K1F120R0l0B0=0@0_0{0Q0l0I0Q0W1Y0Q0T10050-0)0W0t1T0^0`011X1Z1#1Z0T1+1-1)0T0)0O0R1a1*0P1G0T0Q0=1d0U0z0f0#0{0p011/1V010F0/0t0#1l0t1)2a2c2h1;2k1-2n0N2p040a0Z0i0P0O0z0O0U0l1g1i0+280P0P0t0h2K1y2r0#1G0g262W0T2423250R2t0{1#0#2m2H1)1Q1S0?1:2*0l2,0#201R1)0z2P1G2U2W31132b1i2=2i2`0P170W100C2T3511342s371;393b100p3f2c3h2U2)013m0f3c040M3q2V123t3k0{3w3y0X3B3s353u3H100q3K3D3M3F3v0O3a3x100$3R3i361U3l3W3n040v3#3E3(3G3*3Y040w3K1H2 1y2:2Z0R2%3u0h202z0*1R1G2~0t303g3_420+4a3j3:3v100T0O0-0W0j0F1l0/0n3K0Z3$3u0O100%4t4v3U0N0l100E3.3T4h0#4j4l3x0j0Q3W2E0P4A3/2?014x044z1z3g4u4U2i4D4F3R3S4g4V0Y100F3W4T4I4V4K042m2!0t0t4?4-2i0O0S102^4 3%4^4:0/0N1x4!3r4B4h0 040H3R0Z5l4$4@2i4/040l0F563u0U2f04010e4q0W0n015u3U52540#5F4J104{2P4~5d2V5f4V5h0!3_4%1;5w10010r2m2P0U5E5Q4f572i5h0c5j5+065m5@5n503l4L4m4o5B4s5+5_5-1;4X0G4Z31623N5M0#4|5P335X0{5U5W5o5Y5x010x4l1w5*6f6k6h100c5k5m5S5p5M1#5t616z6l5!0A4Q3W6r4#6F0{5H5r5J6E6g4i4`6c5O6j5`6u045V5+6N015Z5y5$0#5(6L5e6T5/5;315?5^5l6(4_4k5}4P2O4=6S6t4W10665K586V6d6Y636!6$6s6Z6)6m6o0T6q7b3u5/3#0g4d493`7s0g3}1y0T3 7x2#2X1 212Z0f1,7u3}1E5,3u2P0N5~0Y0t4O0M101q1s1u1w0Z6?4b1L3h1F0y1i2~0O2k7k0Z0l0h0l0Z0R0(0Z4p2J0Z7X0Z1-0;0+0(0d0Z0I5%7Y0U1h0T7/0#421m0f0}7H0;0o0R2c0;0h0,7.1#0U7.2M2v5b4u1r040f0Z4D0#0l171y8x0D0K1H7%1b7=0W001h0Z880(0Q0.7.8d2b2P0P7?0t8284868m0O8e8g7 0b0Z8P0R0O7{1f0/0l0U0t8Z8183057r3u1?1!1$1(7L3U5q5s3_7q43040Z0,0Z2b0;0(1i8 43911$1^1%2q73986D686(4X0K9y776A4`6C9a7r040K0Z0L001w8a1-0=0^9g189e0d1r0z9N0f0B2Q7~7Y856-7Y9l4e0k0R9Y6c0(2P1y9F9e8a9)495A4D5C9;9c8J1P1R3u2c2`0-7.929p951J3{336%9F6{5|4N0f9,4{9/6e6M6T4X67an734)044G5=af046}4N4p9{609vao4y9A1;atav6@4,7c015q4;4S727g4_5N4}aH6O536QaX6U8u5c7faN5h7!3r6^6`6T9ta#6*019+9-0Tal6/2V695GaZ55aSaNaU6WaW6%6;107e4b6Ta?6,6.7m3U6=6x6_axaz4naia_ala#65aq3ra~5L796Xb7736ibz7ga?7j7lbCa*6vbjbv4.549uarbD6m9`4ra|9d9wb06RaE73b47abH7nb9bg4hbd8(bU6(bi61bL2i0h0C10030Z0o0C0DbK5@bl4M4naB4rbr75bta}axaVam6:bAb)b%3UbE6p5)b*5TbJaw9b4e7t2W7J051d3h1#040u1i8`420#2(9^9n1@949r7ga;6%cp490Z0f7^1#8#7?009j4u903Ua7cI964h5q0t9DcMae0gcx120gcvc/0+0-0/0U04.
Projection(s)
Comment faire pour n'obtenir que les noms des films cités dans le fichier ?
On peut procéder ainsi :
>>> [entree["Name"] for entree in films]
['Citizen Kane', 'The Godfather', 'The Wizard of Oz', 'The Shawshank Redemption', 'Pulp Fiction', ...]
Afin de généraliser le procédé, 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.
La fonction projection
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.
.128013,f]:gSa3/mocPrhdwitsy(2Rlek j[n=puv1)b050q0A0t0h0s0z0u0C0m0z0h0u0u0G010t0s0H010406050u0I0k0k0h0o0v040g0l0z0I0%0l0F050j0.0:0=0@0,0H041017051a0j1a1c170,0q0s0J0V0X0Z0#0p0s0f0p0z1q0p0t0*050Q0M0z0A1l0Y0!011p1r1t1r0t1z1B1x0t0M0l0q0@1y0o180t0p0V0`0u0H0h0F0#0x011D1n010c0S0A0F0h0k0A1x1#1%1,1F1/1B1=1@0*0a0C0n0o0l0H0l0u0s0}0F0C0O1Z0o0o0A0m2c101`0F180j1X2p0t1V1U1W0q1|0#1t0F1;291x1i1k0W1E2z0s2B0F1R1j1x0H2i182n2p2T0-1$2d2H1-2M0o0;0z0*0K2m2X0+2W1{2Z1F2#2%0*0x2+1%2-2n2y012=0h2(040i2_2o192R102F2s0q2w2}0m1R1^18391b372V112,053e0O2S2X2}0B0*0O0c343r2/1m1F0r0*0C3y2.2Y3B0#0F0c0*2Q0l0D2j2l3m2`3H2}0)040w3G2|2:3K3v0~2B0A0u3!3s3$013X0b3y3F3#3J2~3v3+0m0o0(0t0A0I0o3-3A2I3:0*0L0e3y0,3^463D040C4h3F3T354d1-0u0q0*014r0y1;0J0l0s1C0X0C1t0u402e3+0C0J30410o0U2f0m1C0O0u3}3 4J4r014b4i3@3.3_3u042i0t420 4k4g3V3/3X0E443I460F0*1;2t0A0A4;3W0*4:4+4-3_4@044P4R0H40424}4.0*0d3?52464#0c0l434+4Y452!4^0F4`4|5m5g1-0l4f2K5f4m2;3(0F3*3,515B0#3X5e4+0,0j3p0A2p2Q5Q381j3a2s2u2q1Q1S2s0h1A5T0j395N0O0Q0S0u04.
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.
.128013,f]:gSa3/mocbPrhd_witsy(2Rek j[n=puv1)l050r0B0v0h0u0N0w0D0m0N0h0w0w0H010v0u0I010406050w0J0k0k0h0p0x040g0l0N0J0(0l0G050j0/0;0?0^0-0I041118051b0j1b1d180-0r0u0K0W0Y0!0$0q0u0f0q0N1r0q0v0+050R0n0N0B1m0Z0#011q1s1u1s0v1A1C1y0v0n0l0r0^1z0p190v0q0W0{0w0I0h0G0$0z011E1o010c0T0B0G0h0k0B1y1$1(1-1G1:1C1?1^0+0a0D0o0p0l0I0l0w0u0~0G0D0P1!0p0p0B0m2d111{0G190j1Y2q0v1W1V1X0r1}0$1u0G1=2a1y1j1l0X1F2A0u2C0G1S1k1y0I2j192o2q2U0.1%2e2I1.2N0p0=0N0+0L2n2Y0,2X1|2!1G2$2(0+0z2,1(2.2o2z012?0h2)040i2`2p1a2S112G2t0r2x2~0m1S1_193a1c382W122-053f0P2T2Y2~0C0+0P0c353s2:1n1G0t0+0D3z2/2Z3C0$0G0c0+2R0l0E2k2d0s0k0J0N0(0I1C3H2}2;0$0*040y3#3t3%2 3w0 2C0B0w3,3B2J013)0b3z3G3$3K3/040P0w0m0p0)0v0B0J0p3@3n2{3I2~3)0M0e3z0-403`3E040D4r3G4e364n1.0w0r0+014B0A1=0K0l0u1D1C0V0K314a4c2f1D0m3?4P45470I494b0w4B014l4s3 3-413v042j0v4b104u4q4g3.3)0F3^3J3`0G0n0+4.3Z0B4`4h0+3+4;4?410G0+1=2u0B52574w1G4^533.5a435k413)0d3~583`4+0c0l0p5s5h3L3w5z4)3`0l4p2L5D3_2#3w3?46484N4d2W5A3{0+0M5J4{1.5v5x5X2~5m5c2j5f2U4(5K1G5G0+5I4;5-5Y2=3:0G3=5R3o5T5q4l113q0B2q2R64391k3b2t2v2r1R1T2t0h1B670j3a0-6k0Q0S0U04.
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.
Écrivons une fonction pour cela.
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.
.128013,f+]:gSax03/mocbPrhd_wi;tsy(I25Rq4ek j[n6=puv1)l050u0J0z0i0x0W0A0L0p0W0i0A0A0Q010z0x0R010406050A0S0n0n0i0s0B040h0o0W0S0;0o0O0L020i0n0R0y0L0G0J0~0s0H0S0J0A050m0{0}0 110_0R041p1w051z0m1z1B1w0_0u0x0T0)0+0-0/0t0x0g0t0W1P0t0z0@050!0q0W0J1K0,0.011O1Q1S1Q0z1Y1!1W0z0q0o0u111X0s1x0z0t0)140A0R0i0O0/0E011$1M010c0$0J0O1c0J1W2123281(2b1!2e0n2g040a0L0r0s0o0R0o0A0x17190Y1 0s0s0J0p2B1p2i0O1x0m1}2N0z1{1`1|0u2k0/1S0O2d2y1W1H1J0*1%2X0x2Z0O1@1I1W0R2G1x2L2N2^0`22192)292.0s0~0W0@0U2K2|0^2{2j2~1(30320@0E3623382L2W013d0i33040l3h2M0_3k3b0/3n3p0I3s3j2|3l3y0@0F3B3u3D3w3m0o313o0@0P3B1y2?1p2%2Q0u2U3l0p1@2q0X1I1x2=0J2@373S3#0Y3-3a1L1(0K0@0Y0c3S3v3@0/0w0@0L3}3K3 3m0c0@0A0o0}0J443?2*010?040C4e2}460O3`182Z1n4l3l4i0b3B433~4g4o040Y0A0p0s0=0z0J0S0s4t3L4i0V0f3I394m4g41040L4X431q3.4z290A0u0@014+1h0O0T0o0x1#0+0L4a4c0L4D0L0T3o4J0s0(2D0p1#4D4F4H4 4+013I4Y4y454A0@0z0o0!0W4x4S3l0o0@0Q5l4$1(0n0x0@0k5b4Y5m3L3_040c3N5r5e2 0@2d2R0J4d4!3i5d4f290o4V2,5G5R3c4p0O4r1o5O2M5A464i4Q5%0^5c5c5)5f045h5j5W4T5S0@0d5q5-5Q5`5Y045K2G5N2`5s0/4i0N4M4n3`1n560R4I4K6c4g4i0e5y4X5;295C2G0z4K0O5_3E5g5i3o4R0m3:3,3T6F0m3W1p0z3Y6K2S2O1?1^2Q0i1Z6H3W1v3=610/2G0n0v0c0i0K0J0v0t0l0@1h1j1l1n0L5,2`1C381w0D0W0L0J0j0x0A4I0L0R152z4 0(4a152B0(3o4I0s2e0;0T6?5,1F050S0W381S040i7k0p0L4?5E0O2I0x18436E042=0o0M2H2J6D3$4W5,7s0_0m7p382%3l1*1R1T1V3*3U6_2`7F6q3^6e3|5-7*40426k2 48044^2p7=1(4i4k7.683m5Z5#7{690@4w5 7/814C6f4G6h4 844h0@4P4R804V5:7 5H1(4(4*4,2d4/4;7x0i4@4b2p4`6?4}1!4K511#538C4E8d6i0s596o606y5?6A5k88805o045~2^8R3L5u5w8Q895C5E4L8W8p3x0@8E8f8/5X0/5T0@5V8^6Z8a7H7J7B188g7}8g4B0u4q5M5$678:8h04878#89988c576j8o8_9f8j5-065/5z804B5@6B8~5n5|8!378$6d048?9n2^9t9v9e6s0Z6v6x3L9x8U6C7)1C3U6I3)0_7T0_7s7u2H8x0L7z936w6E7W1T1,1U2h9e0O0q490|3S7M3;8C2t0B1}7D7P0x387S7q1G1I9;1+7Z2;7$3.7.7)805C3{8g8m977@7_664#9e969o8 989a4sax4u869R9G558M8@9d9p4O6^373J9p8m5zaC3L8r04594-8v4=8yas8K4|4~8Ga18JaH9m8O4+8*al0@6t9Q9A9S9{7^9}aT5*0@0C6ba~5=645M950@b2aKay6e8La.b7046na_468,5Fbib40O5Lat5P898{048}9i9w829bbf0e0V9V7N6G2N6W7oaa059(7v9+9-2B7E7N917K7C6w9 3,6 0zbN189.059:3L7X9?7!9ja{1r9~7F6@1p7Q1p9$3(2(46b*af7#6F7%3.ak9N7,ao7;b37?498Abq5(80awba8S995!bzc87|aEbm5I8bbd8e9JauaL8iaN3iaP8 aR6pcl0/aVaX8u4:a!8z4_4{9I50a+549lcsa/5a9s5:a=04a@7haF4Ab.a}cg4Nb0970@bSb$cD9f7~c)aGaA9ccu8 4vc#cpa-cSbf0VbC9s1p9W3+bG9!3V0Z0#0%04.
Il est désormais possible de calculer la moyenne des valeurs d'un descripteurs. Là encore, écrivons une fonction pour cela.
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.
.128013,f:gSa3/mocPrhdwitsy(2Rlek n=puv1)b050p0z0s0g0r0y0t0B0l0y0g0t0t0D010s0r0E010406050t0F0j0j0g0n0u040f0k0y0F0!0k0C050i0+0-0/0;0)0E040}1405170i1719140)0p0r0G0S0U0W0Y0o0r0e0o0y1n0o0s0%050N0J0y0z1i0V0X011m1o1q1o0s1w1y1u0s0J0k0p0;1v0n150s0o0S0@0t0E0g0C0Y0w011A1k010c0P0z0C0g0j0z1u1Y1!1)1C1,1y1/1;0%0a0B0m0n0k0E0k0t0r0`0C0B0L1W0n0n0z0l290}1@0C150i1U2m0s1S1R1T0p1_0Y1q0C1.261u1f1h0T1B2w0r2y0C1O1g1u0E2f152k2m2Q0*1Z2a2E1*2J0n0.0y0%0H2j2U0(2T1^2W1C2Y2!0%0w2(1!2*2k2v012/0g2#040h2?2l162O0}2C2p0p2t2`0l1O1=153618342S0~2)053b0L2P2U2`0A0%0L0c313o2,1j1C0q0%0B3v2+2V3y0Y0C0c0%0j0k0u1.2y3D2_2-0Y0$040v3Q3p3S2{3s0{2y0z0t3X3x2F013U0b3v3C3R3G3!040L0t0l0n0#0s0z0F0n3*3F3,3U0I0d3v0)3=3,3A040B4e3C3j2@3E2`0t0p0%014o0x1.0G0k0r1z0U0B3L3N0C2y2b3(0B0G2}3 0n0R2c0l1z3_3{3}4H4o01484f3;3Y3?3r042f0s400|4h2l4V3+2X0%0t0k0-0z422`3U3W4(3w434,3^3$0z3(4=3Z3.3:4j3Z0C3s3(4O0E3~40513?45544a1*0k0%0i5h4W3,0C0J0%1|5e440%4^2S5i2.3#4A4 3)4_555f0%0I480}3m0z2m2N5N351g372p2r2n1N1P2p0g1x5Q0i360)5%0M0O0Q04.
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)
Pouvez-vous calculer la moyenne des revenus générés par les films pour lesquels les revenus sont connus ?
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.
.128013,f]gSa3/mocbPrhd_)wi;tsy(2Gek [n=puv10l050q0C0w0g0u0N0x0E0l0N0g0x0x0H010w0u0I010406050x0J0j0j0g0o0y040f0k0N0J0(0k0G050i0/0;0?0^0-0I041118051b0i1b1d180-0q0u0K0W0Y0!0$0p0u0e0p0N1r0p0w0+050R0m0N0C1m0Z0#011q1s1u1s0w1A1C1y0w0m0k0q0^1z0o190w0p0W0{0x0I0g0G0$0A011E1o010c0T0C0G0g0j0C1y1$1(1-1G1:1C1?1^0+0a0E0n0o0k0I0k0x0u0~0G0E0P1!0o0o0C0l2d111{0G190i1Y2q0w1W1V1X0q1}0$1u0G1=2a1y1j1l0X1F2A0u2C0G1S1k1y0I2j192o2q2U0.1%2e2I1.2N0o0=0N0+0L2n2Y0,2X1|2!1G2$2(0+0A2,1(2.2o2z012?0g2)040h2`2p1a2S112G2t0q2x2~0l1S1_193a1c382W122-053f0P2T2Y2~0G0+2j0K1=0J0x0r0K310u0P0x35040E2/2Z1n1G0k0+0H3I3K2}2;0$0*040F3I3L3u0+1=2u0C0C3S3#3V010D0+0c0k0o3,3U3N0$3v043(2j3+3n2{3T3t3.0k0t0+2L3^443`2 3;0T0j3H412p432:4c3:040u0c4a4l2J4d3}0G3)402W3_4t3X3Z4i3s4s1.0x1+04010B270!013!4A1.3X0d4r3M4t3P04020e0w0v4V2~0j0u0+0M4Q4b4B0+4U4E060-4R2=0+0j0k0y1=2C3C3E0P4(453Q544c3|4|4~0G2C4.4G1G3X0z5e4W2#3w0C3y0G3A511u3G5j2~3X0b574t4I0+4L4N0x4P4E3-4c3X0s3I0-0i3q0C2q2R5P391k3b2t2v2r1R1T2t0g1B5S0i3a5M0P0R0T0x04.
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.
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.
.128013,f{+]:gSa3/mocbPrhd_}wi;tsy(25Rq4e7k j[n6O=puYv1)l050t0I0z0j0x0Y0A0L0o0Y0j0A0A0R010z0x0S010406050A0T0m0m0j0r0B040i0n0Y0T0?0n0O0L020j0m0S0y0L0F0I100r0G0T0I0A050l0}0 11130{0S041r1y051B0l1B1D1y0{0t0x0V0+0-0/0;0s0x0h0s0Y1R0s0z0_050$0p0Y0I1M0.0:011Q1S1U1S0z1!1$1Y0z0p0n0t131Z0r1z0z0s0+160A0S0j0O0;0D011(1O010c0(0I0O1e0I1Y23252a1*2d1$2g0m2i040a0L0q0r0n0S0n0A0x191b0!210r0r0I0o2D1r2k0O1z0l1 2P0z1}1|1~0t2m0;1U0O2f2A1Y1J1L0,1)2Z0x2#0O1_1K1Y0S2I1z2N2P2`0|241b2+2b2:0r100Y0_0W2M2~0`2}2l301*32340_0D38253a2N2Y013f0j35040k3j2O0{3m3d0;3p3r0H3u3l2~3n3A0_0E3D3w3F3y3o0n333q0_0P3K3b2 1N3e3P3g040J3D1A2^1r2)2S0t2W3n0o1_2s0Z1K1z2@0I2_393%3:0!3{3c3X3z0_252#0I0u2o0m1q1s390L3V3n0n0_0R3D4e3x42010^040d0v3K3L412,010K0_0c3P4k4f3N0O0_2f2T0I0I4C4m4w0n0w0_2.4L3M4n4F04494b2|4M2b4p0g3K0L4)4l4T4w4y040x0c4S4v314G0O4I4K4c3k4D4n4p0N3%4!1*0A2804010U0I1101524,4#0_0f4=3W4N4P042:0z5i4g5l4R4|2O4+4?3e440O46480(4a5d5w0;4$4(4*5J4~4w4V454J5B0Y5D5t405j5f04515T5L4@044H2I4{4Z5e1*505E5V5456585a0r5c5Z535G5g5h5T5v5/0;4h044j5~5!1*0m0x365I4)660;4.0I0)5)3|5`4o0_4%5T065J5K6k5N5z5P4X5.3n5-5_5+435$4_5(6x3N6z5*5F01550_5=5b6G4 5|5p3N620e642`5 3n686a6o1r3~3`3(6*0l3+1r0z3-6/2U2Q1^1`2S0j1#6,3+1x5U3n2I0m480j0K470s0k0_1j1l1n1p0L6n2|1E3a1y0Q1b2z0T2H0%0z0L0j0T0/0x0L180(0x0A0I0r0L0-0L4A0O2K0x1a4e6)042@0n0M2J2L0l7N7f1A3a2)3n1,1T1V1X3^3)7h2|7N6d3o5y5A6w656k626X4d7.4p4r4t7.4.4A0r6T4U7:4J835k4Q0O875#7P7R7J1a6Q4w4p0C8h5#7=6J606l040b8b5:6N596P6A6K4p0X7g396p4*7 4Q4;7?6B7/045O6i3k6Z6U5l5n8t615r8a8J6K6t7;5C4Y6j8K5H6o6q8F6s85478n8(8z0_5Y8o3G8/8l5,5g8U017^8 6#04378+8-8K6f6h8|5{048C3k8E8,7.8!6v8$9b8q8^8=8p9j8O2O7{8~8Y8p6V7_8P7.93952`0{7U3;2P3_2P6~3*0#0%0)04.
Il reste à déterminer l'année durant laquelle le plus de films ont été produits.
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.
.128013,fx:gSa].3/mocbPrhd_)wi;tsy(25Rq4e7k [n6O=puNv10l050t0I0z0h0x0X0A0L0o0X0h0A0A0Q010z0x0R010406050A0S0m0m0h0r0B040g0n0X0S0=0n0N0L020h0m0R0y0L0F0I0 0r0G0S0I0A050l0|0~10120`0R041q1x051A0l1A1C1x0`0t0x0U0*0,0.0:0s0x0f0s0X1Q0s0z0^050#0p0X0I1L0-0/011P1R1T1R0z1Z1#1X0z0p0n0t121Y0r1y0z0s0*150A0R0h0N0:0D011%1N010c0%0I0N1d0I1X2224291)2c1#2f0m2h040a0L0q0r0n0R0n0A0x181a0Z200r0r0I0o2C1q2j0N1y0l1~2O0z1|1{1}0t2l0:1T0N2e2z1X1I1K0+1(2Y0x2!0N1^1J1X0R2H1y2M2O2_0{231a2*2a2/0r0 0X0^0V2L2}0_2|2k2 1)31330^0D3724392M2X013e0h34040k3i2N0`3l3c0:3o3q0H3t3k2}3m3z0^0E3C3v3E3x3n0n323p0^0O3J3a2~1M3d3O3f040J3C1z2@1q2(2R0t2V3m0o1^2r0Y1J1y2?0I2^383$3/0Z3`3b3W3y0^242!0I0u0 0d0x3C0L3U3m0n0^0Q4b4d3M0K0o0^0T190I3T3w413n0^484a1r384c4s2+014f044h4y3j4A3L4t0m0x0^0W3J3K404C0K0^0c3O4i4B30430N454Y4K4C0n0w0^2-4(4S4!04440I462n0m1p4H2N4j4t0@040e3J0L544J4:1)4U040x0c4/3V4C0N4#450u4_4{2{4Z1)500M3$5n424=4$4@5r4)2a500i5d4e0^020f0z0y5C3M5g044w5x570:50524|0_555V565e4;5N5T5X5D4F5J4t5L4?4^0%4`5O5Y5o0^5q5T4~5f5h5w5^5s015A535W545_4;5,470h495)4*4g6a655v4q5T0`0l3}3_3%6l0l3*1q0z3,6q2T2P1@1_2R0h1!6n3*1w3 5;0:2H0m5j0h0K460s0k0^1i1k1m1o0L5S2{1D391x0P1a2y0S2G0$0z0L0h0S0.0x0L230r3/6%0x0r0L1#0)051j5a0z1j4{6~0L0t0S740x2J0x192f6^1$5S1G3=2)4t1+1S1U1W3@3(6W2{6k6E3F5{465!2_5$3M4E4G7y64584m044o2!4r5y3d4v684x7D5~7B6d1)4M4O4Q7E0:594W0r7T5t5,5:3m500b7%4u042/0m0p2H7.4+4-0N7.5+6f5j5.5l3{7R0^0j7*5K4-705/5}7L5Q0^0C0v6V38065V7Y01595b7|0^7;7?6g7Q8c4D5E5G5I5#8l5L7x828v5R61628B7N698A835(8M8v5L8r7@6h62635~7}5i8D4I8l7S8P5P7/7)6h1q7s6m2O6C3)0!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'
Pouvez-vous déterminer le genre le plus présent ?
Le meilleur genre
Déterminer le 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'].
.128013,f{+x:gSa.]3/9mocbPrhd_})wi;tsy(25G4e7k8 j[n6=puNv10l050w0L0D0j0B0#0E0P0r0#0j0E0E0U010D0B0V010406050E0W0p0p0j0u0F040i0q0#0W0_0q0S050n101214160~0V041f1m051p0n1p1r1m0~0w0B0Y0.0:0=0@0v0B0h0v0#1F0v0D0|050)0s0#0L1A0;0?011E1G1I1G0D1O1Q1M0D0s0q0w161N0u1n0D0v0.190E0V0j0S0@0H011S1C010c0+0L0S0j0p0L1M1@1_1~1U211Q24260|0a0P0t0u0q0V0q0E0B1c0S0P0%1=0u0u0L0r2r1f290S1n0n1:2E0D1.1-1/0w2b0@1I0S232o1M1x1z0/1T2O0B2Q0S1*1y1M0V2x1n2C2E2,0 1^2s2W1 2#0u130#0|0P0Z2B2:0}2/2a2=1U2@2_2{0H2~1_302C2N01350j2`040P0m392D0~3c330@3f3h0P0K3l3b2:3d3r2{0I3v3n3x3p3e0q2^3g2{0T3C312;1B343H363i0M3M3o3P3q3R3J3i0O3V3E3X3G3I3s0o3%323)3z040Z0!3.3O2X3*3S0Z2}1g2 3D3/3`3;0Z383 3a413_2?3Z3h0Z3k473m3N3y4c0|0Z3u4g2E2)0L2E2U2H0w2L3d0r1*271n4t1q2*3N2-2 054y0%2+3(430|1x4y0x0h232x0E3v0P4i3F0q0|0U4W4Y3)0{040d0y3^3y0|260+1Q0W0u4R4T0L4%3W3`4!044$4o4X4}1 0N0r0|0X1d4{4o494/04130f0B4|4M1 4 512,535k1U0p0B0|3@5c5d3F0N0|0c3H5j422?0|4S0S4U5D4a1U0q0A0|2Z5K5e2)0q0Q2y2A4o4(3`4*0G3v5Z5F042d0p4V5Y541U4*0b5R3F0E1|04010J4`0E015%5/0@4*0z0g3C0P675p5E340|0E0q0W0E4_5I0L5-5o5(5M4#5?3:5G5}605q0@4 0k6t6a3q6c0V1I0D6y5L620|5$5.6u015^0|010b0P5 6K6z016366686m0@5z5*5C526Z3e6r6i6p4~5O045Q6(616*046d6f6h5J6T6G6V0|655c6873696~6#0B0c6-5)5H2x7a5M6/2#6E6=6L5N5P1e7j6U0S4O0B4Q7c6j6F3d4*712,06747C755e4P0q6{7v6}7x0|0R7w3F7q047u7O4)0|0l7e6v6o7o6~5s4l6X7C6)6#0L0,5b2.6?7y7(7D676)7Q7G7I6k4H7:7M7T4N7R4`801 4*7W7!3d4 0e5n2 7E3F7$3=7=737*5P79887P7r7t6s7K3F4*7N8s6q826,8w5!7V7X014 020h0D0C8D7Q5g5i8A85708i7D7^4:0L4=0L4@7I8D5m8K6+7d727?6Y6?8L0j5h8!7Z6l8,8p7H7u7|3a6)8u846b5f8V0#4?4^7S8O5:8C5c1f4J4r1o4E0n4C2F4v1f2I2H1)1+2H0j1P9c9f1y309f0(0*0,04.
# Tests(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)