Les deux meilleurs

Vous venez de développer Flap Flap Bird, un jeu très dur où il faut aider un oiseau à éviter des obstacles. À la fin de la partie, vous enregistrez le score du joueur et vous souhaitez afficher ses deux meilleurs scores. Ceux-ci peuvent être égaux.

On considère les deux listes de scores suivants :

  • scores_1 = [13, 15, 12, 3, 19, 7, 14]

  • scores_2 = [27, 35, 14, 35, 3, 26, 9]

Pour score_1, les deux meilleurs scores sont 19 et 15. Pour score_2, ce sont 35 et 35.

Il est possible que la liste de score contienne moins de deux valeurs. Dans ce cas, les meilleures valeurs sont remplacées par None.

Compléter le code de la fonction deux_meilleurs qui prend une liste d'entiers scores et renvoie :

  • le couple formé par les deux meilleures valeurs max1 et max2 avec max1max2 si la liste contient au moins deux scores ;

  • le couple (max1, None)max1 est le score maximal si la liste ne contient qu'un seul score ;

  • le couple (None, None) si la liste est vide.

Contraintes

On n'utilisera ni max, ni min, ni sort, ni sorted.

Aide

Il s'agit d'une recherche de maximum originale car on cherche les deux valeurs maximales.

On pourra débuter l'algorithme en affectant la valeur None aux variables max1 et max2 puis en parcourant les scores. Pour chacun d'entre eux on mettra à jour, si besoin, l'une des variables (ou les deux).

La question principale est donc de savoir quand mettre à jour max1, max2 et les deux ?

La valeur None

None est une valeur spéciale utilisée en Python et qui correspond à un manque de valeur normale. Lorsque l'exécution d'une fonction se termine sans avoir rencontré un return, Python renvoie automatiquement la valeur None.

On peut tester si une variable x contient la valeur None de la manière suivante :

🐍 Script Python
if x is None:
    ...
On pourrait également tester x == None mais si x est un objet d'une classe dans laquelle l'égalité a été redéfinie, l'égalité peut être vraie, alors que x is None ne l'est pas.

Exemples
>>> scores_1 = [13, 15, 12, 3, 19, 7, 14]
>>> deux_meilleurs(score_1)
(19, 15)
>>> scores_2 = [27, 35, 14, 35, 3, 26, 9]
>>> deux_meilleurs(score_2)
(35, 35)
>>> deux_meilleurs([4, 5])
(5, 4)
>>> deux_meilleurs([5, 4])
(5, 4)
>>> deux_meilleurs([5, 5])
(5, 5)
>>> deux_meilleurs([9])
(9, None)
>>> deux_meilleurs([])
(None, None)

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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 : 10/10

.128013s3o_;8bcdufvgI/0lyq n7apSr1meh,(P2=4:Ntwki9]ç5R[x)6050j0D0N0x0Q0r0b0u0i0r0x0b0b0J010N0Q0y010406050b0k0C0C0x0A0s040z0d0r0k0@0d0v0u020x0C0y0f0u0V0D110A0t0k0D0b050p0~1012140|0y041s1z051C0p1C1E1z0|0j0Q0m0,0.0:0=0E0Q0n0E0r1S0E0N0`050%0h0r0D1N0/0;011R1T1V1T0N1#1%1Z0N0h0d0j141!0A1A0N0E0,170b0y0x0v0=0I011)1P010l0)0D0v1f0D1Z24262b1+2e1%2h0C2j040a0u0H0A0d0y0d0b0Q1a1c0#220A0A0D0i2E1s2l0v1A0p202Q0N1~1}1 0j2n0=1V0v2g2B1Z1K1M0-1*2!0Q2$0v1`1L1Z0y2J1A2O2Q2{0}251c2,2c2;0A110r0`0u0B2N2 0{2~2m311+3335370I3a263c2O2Z013h0x36040u0c3l2P0|3o3f0=3r3t0u0K3x3n2 3p3D370U3H3z3J3B3q0d343s370Z3O3d301O3g3T3i3u0w3Y3A3#3C3%3V3u0g3+3Q3-3S3U3E0R3?3e3^3L040B0q3H1B2_1s2*2T0j2X3p0i1`2t0!1L1A2^0D2`3b444d0#4l3~2-010P0`0#0l443,4s0O374y3@4s0v0l4v0D0k0X0e2s0)1%0k0A1r1t4m4z2c0_040G4D4r320`0b4d2J4S2}4V1+4X0Y0L3O0u4?0u3Z3K0`110X394T3m4^4-0=0d0`0J3H514E2c0P0i0`0M1b0D4=4@4_3R0v4{0x0X3k4 2P584#1+5404565q3u5j3^5b5d5f5h4?5A4s4u040l3T575H4$040m5N52010d4B042/5S593g4%4)1q4!3!4s4X4;5y064@5:5s5*5a0`0Q4x5y5=4`044|4~2{5|3R5V5^4+3b625B5c045e2$5Z5t535W5M5{5O5#5Q6e5?5u0`020n0N0f6n5}5 5)3p5,5F5;5:6k3C5m5o6v63556I3 6G603b5/6C5;6E3q6N6L4s5v5x616T5l6m5.6R685I0`0D1V5`6!5T6$4|5p6:5!6g656W5a6a6c5g6j5T64046i6^6f6U6%766o536q6s6u716_786?6y3R6A6(6)5i6;6G6@676T6Y6|6l5R7n5G5T5J2J0N4Q0v7w6F5~5n6O3m6T4X0F7H7i5n7s3m0|0p4o4k457Y0p481s0N4a7%2V2R1_1{2T0x1$7!481y4q7b012J0C0e0l0x0P0D0e0E0c0`1k1m1o1q0u5-2}1F3c1z0o0r0u1q0N0u2A0:0Q7;0u2G7~0Q2J0u0k2$0u7~0T1b8l180+2^0d0i0E1(0j008w1(2J8H0D0A8P8q1(4|0Q0C0 2n0Q880F0u0b260+0N8j8Q4^7X6b5E7W4e3u5-1I4g2+3^1-1U1W1Y7^3p2p2g2i0`2v0z0i0A0^8k0H0s201b444j7^2|4m8/6T5J4w7k3^5W4^5y6#4H040#4K4M0D4O4J4R9q5+0`4Z9u7q044(3T5(9J7h4/8b6P6D7B5^6/7t6;0h0`2q9F4W9H9%6l9M4*9*0=4/7Q6Y6Z9Y7h0C0Q0`439P777m2{6Q6C9n0`7D7F7Q5C8:6d9}7_7Oa76~8;a09U7h5J6-5_7Q0v9!049$ab6z9)as5k5$9N667M5T9:7g779=7Q9_0`7L2P7N0`9S7U6)a304a50A7GaD7_6$9,9O4,9Q0`0W9.01aH049|a!9~0`0S7PaV3pa86 6BaQama=aw9L5%azaKaBa$a(a*a,4Ua#040S9;7d6tanax9-av3^4Xa%bh4sa*aJ917la/aN3yaP9K6xbl9(04a;7a6w7Sbb5wbea~aya(bjb49`a+bJa/bA9@77aXa bO04bka-7_bnbVba7z6*5@046-0b70bYat04bs0{bu7h6=7KbVbQ506#7rbE9?b|9KaYb0bpbib3bx1+b!c89/bPbGc3bVbXb777b5b#a_9V5K75bRaW5^9;5W5Ya|3 ap0A260nb-ciacaub.3Ra*7Tb1b8b{5r6#aparcGc64Ya(bTbIcb014/4:6Bai775Ja{bBa}cfcXbKcX6$0Qclcw6Xbc7fc*6M7J4}bVb;a17ob}c|cJ5z726Kc?5Pbwah7o7Ab@6Vd86pbFdg7Ic,cR9GbWcUcsc-a/c#7paj6,6.cebUdrdoc/dqdmbyb$c`c@046rbddj7R6HdAc dcddbSb~dM7vdMcVbgdE4.c7d!7Ic;dAdG9Tduc%a40$a6dXdfd%cY0`cMd5ded33Y8=4p7Z2Q7?470$0(0*04.

###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
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 : 10/10

.128013s3o_;8bcdufvgI/0lyq n7apSr1meh,(P2=4:Ntwki9]ç5R[x)6050j0D0N0x0Q0r0b0u0i0r0x0b0b0J010N0Q0y010406050b0k0C0C0x0A0s040z0d0r0k0@0d0v0u020x0C0y0f0u0V0D110A0t0k0D0b050p0~1012140|0y041s1z051C0p1C1E1z0|0j0Q0m0,0.0:0=0E0Q0n0E0r1S0E0N0`050%0h0r0D1N0/0;011R1T1V1T0N1#1%1Z0N0h0d0j141!0A1A0N0E0,170b0y0x0v0=0I011)1P010l0)0D0v1f0D1Z24262b1+2e1%2h0C2j040a0u0H0A0d0y0d0b0Q1a1c0#220A0A0D0i2E1s2l0v1A0p202Q0N1~1}1 0j2n0=1V0v2g2B1Z1K1M0-1*2!0Q2$0v1`1L1Z0y2J1A2O2Q2{0}251c2,2c2;0A110r0`0B2N2 0{2~2m311+33350`0I39263b2O2Z013g0x36040c3k2P0|3n3e0=3q3s0K3v3m2 3o3B0`0U3E3x3G3z3p0d343r0`0Z3L3c301O3f3Q3h040w3V3y3Y3A3!3S040g3(3N3*3P3R3s0R3E1B2_1s2*2T0j2X3o0i1`2t0!1L1A2^0D2`3a3`430#4b3d3=0P0`0#0l3`3)2-010O0`0u4n3;4p0v0l4k0D0k0X0e2s0)1%0k0A1r1t4c4o2c0_040G4u4h4w0`0b432J4J2}4M1+4O0Y0L3L0u4*4t4!3A0`110X384K3l4,4v2c0d0`0J3E4^4S2c0P0i0`0M1b0D4)4+3W3H4/0x0X3j4?2P4 3X4p4{044}5g045i3o525456584*5a3O4j040l3Q4~5x3=0v0`0m5D4-010d4r042/5J4_3f4U4W1q4R5j4N0`4(5o064+5%5q5y0`0Q4m5o5)5F5c4;5Q501+5M5+4Y3a5/4p5s04552$5?5X5^5N5C5.5E4T045I685K5l020n0N0f635b044:4=4Z5R0=4O5!2{5$5(6w69325;6o4L6q014O0F6k3O5G6m5d5f2{5}4`4|6H5:6b5W3o6F6R6a6n5v5(6y1+5z0D1V5-6N6$4.6K5e6X4`5N0Q5{4@6-015 61576d6D5_04676,5K6J6c74700`6g6i6;5S6/6M6C5@6r5Z6!6w5w755;7g6_6e6Q6 7i3p5H6!6`5z2J0N4H0v7d6.6Z5o6`6W7u647G6L3V0p4e4a3{7S0p3~1s0N407X2V2R1_1{2T0x1$7U3~1y4g7M012J0C0e0l0x0P0D0e0E0c0`1k1m1o1q0u6t4c1F3b1z0o0r0u1q0N0u2A0:0Q7+0u2G7^0Q2J0u0k2$0u7^0T1b8f180+2^0d0i0E1(0j008q1(2J8B0D0A8J8k1(4:0Q0C0 2n0Q820F0u0b260+0N8d8K4t7R605u7Q445p5!1I462+3=1-1U1W1Y7/3o2p2g2i0`2v0z0i0A0^8e0H0s201b3`497/2|4c8)7z4z6+7h7:5N4t7I754y040#4B4D0D4F4A4I6U3O4O4Q9o6D6J4V3Q5V9D7v4$853l6v7n6D5z5,7F3p0h0`2q9z3=9B9Y6a9G4X9#5Y040Y9T5l0J5n787v0C0Q0`0q9)4#7k5#7m6O6%0`7B7D9T6|8+6p9K0`6G7L5r538*629}595K6(6*9T0v9V049X9J7:9!aq6l9%9Ia7ar0`9,ab3O9.9:5|6`9?379`7j049M3w9~9h04a20A7EaB6Sav6^2P7J0`0WaJ01aH049_at9A0`0Saa9;7:a5af6u5%aP9SaU9$5UaX8{a,04a#a+3=a(a*ax6Va-9-7a6h6ja{6z04aWa$4Ob2b73Oa(6B3laZ040SaM0{aO7o6/boaY5K7Ka:6l4:7q5h6`9.al5T9Ha~bqbk9k3ob5bia-a/aFbwbhb34pbja$bnbSbr7yai0`6)0b6~bl9Z9|a@7m6`6J7Hb/bZa9bJ7fba5mb}bXb`9*bObp5Kb$bY9*a.c1a}b%c5bz6DbRc99{b(ag9P7v5z5B0Ab}0Q9-6?aTbC6Ian0A260nb.bPb09Cc31+a(bFa b:04bU7r9EanapcHaKcGcEaVcdcjaK0Y4%7lah9Q5+9jcP7v9FcYcT6Ea!a$6JctcZc;clcx3=6fbcb}b_cWb{aLc%6xbwbEb aEc,7:b^5dbybu9~c(c-6Ad9ccbLcec?5+b%0Sd59 0=aja`c|a|dnc_b!c_c@drb 7bbddybfd8dBb;3a9Odhb@7pdlbe7ec2d2c4dp5OdFcmdu6{a10$a3dU7N5=dMcNd07O5#1s9g1F3|7V470|7V0$0(0*04.