Les dictionnaires
Introduction
On rappelle que pour une liste de Python, les valeurs sont accessibles par l'intermédiaire de leur indice. Par exemple les éléments de la liste prenoms = ['Marie', 'Paul', 'Julie', 'Tom', 'Alice'] sont accessibles via les indices 0, 1, 2, 3, 4 comme illustré ci-dessous :
| Elements |
'Marie' |
'Paul' |
'Julie' |
'Tom' |
'Alice' |
| Indice |
0 |
1 |
2 |
3 |
4 |
Un dictionnaire de Python est similaire à une liste mais les éléments appelées valeurs sont reperés par des clés. Un dictionnaire est donc comparable à un tableau associatif de clés et de valeurs, chaque clé (unique) étant associé à une valeur. Prenons un premier exemple, un dictionnaire permettant d'associer des clés (des prenoms) à des valeurs à une adresse mail :
| Clés |
'Marie' |
'Paul' |
'Tom' |
| Valeurs |
'marie@toto.com' |
'paul@truc.net' |
'tom@bidule.org' |
Pour créer ce dictionnaire en Python, on utilise la syntaxe suivante :
adresses = {'Marie' : 'marie@toto.com', 'Paul' : 'paul@truc.net', 'Tom' : 'tom@bidule.org'}
c'est-à-dire :
- On liste entre accolades
{ } et séparés par des virgules , les paires clés/valeurs
- Les deux éléments d'une même paire sont séparés par le caractère
:
Opération de bases sur un dictionnaires
- Affichage :
Pour afficher la totalité des paires d'un dictionnaire, on utilise l'instruction print
-
Accès à une valeur :
Pour accéder aux valeurs de ce dictionnaire, on utilise une syntaxe similaire à celle des listes, mais on donne la clé entre crochets ([ et ]) et pas l'indice. Par exemple l'adresse mail de 'Paul' s'obtient avec adresses['Paul'].
Note
Tenter d'accéder à une valeur via une clé inexistante produit une erreur KeyError
-
Modifier une valeur :
Pour modifier une valeur dans un dictionnaire, on utilise l'affectation =. Par exemple pour modifier l'adresse de Tom : adresses['Tom'] = "tom@mel.org"
- Supprimer une valeur :
Pour supprimer une paire d'un dictionnaire on utilise l'instruction
del. Par exemple pour supprimer del adresses['Marie'] supprimera la paire 'Marie' : 'marie@toto.com' du dictionnaires adresses
A retenir
- Un dictionnaire permet de stocker des données sous la forme d'associations clés/valeurs
- Pour créer un dictionnaire, on utilise la syntaxe :
mon_dico = {cle1 : valeur1, cle2 : valeur2, cle3:valeur3, ...}. Un dictionnaire vide s'obtient avec {}.
- On accède à une valeur par sa clé avec la syntaxe
mon_dico[cle], si la clé n'existe on obtient l'erreur KeyError
- On modifie une valeur existante ou créer une nouvelle association clé/valeur avec une affectation de la forme
mon_dico[cle] = nouvelle_valeur
- On peut supprimer un couple clé/valeur avec
del mon_dico[cle]
- Créer un dictionnaire
coefficient permettant d'associer à chaque épreuve finale du bac son coefficient (voir tableau ci-dessous) :

- Ecrire une instruction
print permettant d'afficher le coefficient du 'Grand oral'.
- Quelle instruction permet de modifier le coefficient de la philosophie en 9 ?
- Quelle instruction permet de rajouter l'épreuve
'Option' avec un coefficient 2 ?
- Quelle instruction permet de supprimer l'épreuve
'Option' crée ci-dessus ?
Test d'appartenance à un dictionnaire
On peut tester si une clé existe ou non dans un dictionnaire avec <cle> in <dico> qui renverra true si <cle> est une clé présente dans <dico> et <false> sinon.
Note
On peut aussi utiliser in sur les listes pour y tester la présence d'un élément par exemple 2 in [1, 9, 4] renvoie false. Pour des raisons qui seront détaillées plus loin dans le cours, on limitera volontairement l'utilisation du in aux dictionnaires et on l'évitera sur les listes.
Ecrire une fonction dico_occurrence qui prend en entrée une chaîne de caractères s et renvoie un dictionnaire dont les clés sont les caractères présents dans s et les valeurs leurs nombres d'occurrences. Par exemple, dico_occurrence("Bonjour") doit renvoyer le dictionnaire {'B' : 1, 'o':2, 'n':1, 'j':1, 'u':1, 'r':1} car tous les caractères apparaissent une fois sauf o qui apparaît deux fois.
Indices
- Créer un dictionnaire vide
- Parcourir la chaine
s caractère par caractère
- Si le caractère est déjà présent dans le dictionnaire incrémenter son nombre d'occurrence, sinon l'ajouter au dictionnaire avec une occurrence de 1.
Parcourir un dictionnaire
On peut parcourir un dicionnaire par clés ou par valeurs et la syntaxe est similaire à celle déjà rencontrée sur les autres itérables (chaines de caractères, tuples, listes) : on utilise une boucle for <cle> in <dico>. Par exemple, dans la boucle for c in {"A":6, "T":12, "C":9, "G":14} la variable c prendra les valeurs "A", "T", "C" et "G".
Au jeu du Scrabble, chaque lettre a une valeur comme indiqué sur l'image ci-dessous :

Le but de l'exercice est d'écrire une fonction score qui prend un argument un mot et renvoie la somme des valeurs des lettres de ce mot. Par exemple valeur("GIRAFE") doit renvoyer 10 en effet :
et donc la valeur est \(2+1+1+1+4+1 = 10\)
-
Compléter une première version de score qui parcours les lettres du mots et ajoute la valeur suivant la lettre rencontrée.
| Python |
|---|
| def score(mot):
total = 0
for lettre in ....:
if lettre == 'A' or lettre=='E' or lettre=='I' ..... :
total += 1
if lettre == 'D' or lettre == 'G' or .......:
totel += 2
...
...
return ...
|
-
Les dictionnaires à la rescousse
-
Créer un dictionnaire valeur dont les clés sont les lettres de l'alphabet et qui associe à chaque lettre sa valeur.
-
Utiliser ce dictionnaire afin d'écrire une version bien plus courte et lisible de la fonction score.
Dictionnaires et mutabilité
Les dictionnaires sont des structures de données mutables de Python, on retrouve donc les deux conséquences déjà observées sur les listes, à savoir :
-
lorsqu'on on crée un dictionnaire avec l'opérateur = à partir d'un dictionnaire existant, toute modification de l'un entraine une modification de l'autre :
Pour crée une "vraie" copie d'un dictionnaire dico, on peut utiliser dico.copy(). Par exemple, ci-dessus, on écrira ligne 2 dico2 = dico1.copy(). Les modifications apportées à la copie ne se répèteront pas sur l'original (et inversement)
-
lorsqu'on passe un dictionnaire à une fonction, tout modification effectuée dans la fonction modifie effectivement le dictionnaire
D'autre part, les clés d'un dictionnaires doivent nécessairement être non mutables, donc les listes par exemple ne peuvent pas être clés d'un dictionnaire, une tentative en ce sens, déclenche un TypeError.
TP sur les dictionnaires
Exercice 1 : les moyennes
Voici un dictionnaire contenant les notes obtenus par des élèves :
| Python |
|---|
| notes = {
"Albert" : [7, 11, 15, 8, 9],
"Alice" : [14, 11, 6, 15],
"Bob" : [9, 9, 13, 14, 9],
"Louise" : [11, 13, 12, 14, 14],
"Michelle" : [2, 5, 4, 9],
"Luc" : [18, 14, 18, 11]
}
|
Complète le code suivant
- Écrire une fonction
moyenne qui prend en argument une liste non vide d'entiers et renvoie la moyenne des éléments de cette liste.
- Écrire une fonctions moyenne qui prend en entrée un dictionnaire de [prénom]:[liste_notes] et retourne un dictionnaire possédant les mêmes clés (les prénoms) et contenant la moyenne de chaque élève.
.128013oP;f 8lkg5:+,bry2a1}hé3tvw=u6{e[(Sn9]_s-c)7iêm./4p0d050!0F0y0s0S0h0N0f0P0h0s0N0N0B010y0S0Y010406050N0C0U0U0s0p0q040I0b0h0C0^0b0J050W0 1113150}0Y04051l1e1o0W1l0}0!0S0z0-0/0;0?0/0J0j0C0s0j0F0O0Y0q0y0v1c0f0v0S0j0v0h1Q0v0y0{050(0o0h0F1x0:0=011P1R1T1R0y1Z1#1X0y0p1m1L0-180N0Y0s0J0?0r011%1z010e0*0F0J0s0U0F1X1|1~231)261#292b0{0a0f0c0p0b0Y0b0N0S1b0J0f0$1`0p0p0F0P2w1e2e0J1m0W1L2J1?1^1@1Y0!2g1A0S0J282t1X1u1w0.1(2T2V0J0b2Z1X0Y2C1m2H2J2:0~1}2x2#242)0p120h1X0s1O2C0e0?030M0M0P2*0F1T2(0b0O0r0O0t0{0f0t1e0s2;2@0|2?2f2_1)2{2}2 310F33013537393b2W3e3e3i0r3l3n1~3p2H2S013u0s2~1m300v323436380$3E2)3G0x3i0x3K2G3o0}3O3s0?3R3T053V3X3A3Z3D2U3F3f0X3i0X3,1f3.3q2^1y3t0b2|3S3w3W3y3Y3C3#3~3%3f0k3i0k442:3/2@3P3?4e3`3B3!3a4k3d3f0D3i0D4q463:493=4b3v3U3x3z4y3}3c3G0R3i0R4H3M4s3r4K3Q4M4d4O4f4Q3|4j4T3f0g3i0g4Y2I4!482$4%4c3@3_4g3{4i4A4/0O0K3i0K4@3N4t3;4|4N3^4P4h4z3$4C3g0Z0{0t0Z594_4u4(4~5g515i4B3G0t3h045A5q475s4}4w504R4.3 3g215C3J0W3m3-4Z5F5c4v4*4x4-535M0t3)5C3+5R3L4^5V4$5X5f4+5h4S5$415C435+5T5-4J4{5:4 4,525j5z4n5C4p5|453M1p2.1e2Z2M0!1^2R5c4z2Y1v1m2-0F2/3o5}1m4z6s2f0S0!0?362H5z3w6z6B645y3f3h0f2k0F6H5x545B3,5 240i0{0$0e6u5.4{0A3i6!6U3t0e0{0U0b0q282V6)5b4$0`040H6?4#600{2)0y0F0N6|4`246_0l6u0f6#2`0o0{1T0N0y743P6_0Q7i5c0b0{0O020j0y0d797b3t7d040e0h0b0s7h6b2I7w0?776u0}7F6x2x6G016C2@3G5O5f7P5!653f216M2a6O7Q6I547U5|6*0?6%040f7;7a7M7H010N0!0{007}2C0y0b0C0p2V0f0/0f6.6:0J840$0,70727}007K7i7W0M6D3f5(7V6A7(6Q5M3)7#2b6P5@4l0O8o5+7=7a7-3Q6 0o0M8e737M8E6@4{7o040B7v8F0J7y2j7m6^0{6{7@8U6 0b718L2=8F7k8i8$4t8k8m0O5_8p8x5L8z418v7%7X6J8@1X8C7=7^6W041(0F0p7E2:8N6}2`8H8J8)728T8O248Q7r7t9l9f1)0U0S0{5p8:9s7I0{0n9r751)0N5O01867f716M1$0!0b2v0f1}0,0T1?1$0z6z2c8/8,8;8q7R1~3G678_8r8y5k4n8~8`5#8z9+5+7L9#6y9%8l7S4D6F9}8s8z4E9;9-8{5k4E2J3m8D7^0J0{0N0b110F9D3P8Q8S8M7^9u9w9!6t3O8=9 0O4V4O8ka35k4Va69054az3Kad8F970e4bal5W8(71aP4$0b7/2UaT6~048K8Y4{7J7M9`au9$6H8?4;aAa29.3G4;aF7)5Ma/aJ8D958%04ahajaY9n0{0mao9daeaRaka)8j9}8?56a:9=7Y55226Nbi91bga|7;960{7 821dapa b12bb31)8Q0WbB3=9ha#bc9y7Obeax5oa1bn6R5ma^aC5z5mab3pbK0faw9)6K6S30aBa=b%bl7$bQ5$6S7,9m1)976Ya$247/7?9{9E3=6,04886;9kbZ5c6_8#b~4ubt3a0F0zc5cac70{78bxb?3=7y1u2Eb`1)8.cl9z018Q7q7s7ucub 3Qco0Scqc68Z04ck4rbda-bN7Ub)a;a85z7!bma79?5k0t7+aca~cm8Gc26/bFcw0{b73o9ecC6_0E0uc+0P5B032ycF2w290S2C0f9X0$at6cavbMb$3g8ocQb/8z5%b-8wcWbjdfbXaKc%aMaOcBcb04cdcfcr9A049CdqaQa!9j8+c/7^aV0{aXdz5/cc1#cfdDd6c%8Q0Vdvc(2v0F0UdO7G8-8!0QcKdE8Fc_0{c{1}0p38820,d-0f0w0h0w2b0J9c46bZb#0J5z8^dcdi910t8}cVaG5^93c#a}c:dr88dT6_0GdTafdsdMbbchcI0Lc+anc+elc38aeoa+cvc8ekbadY7N7j0{7lbJcad 66bPe46R9:e8a_de9^ecee5c97bu83eu6-c*eJ6t0W6w6d6r6f6o1e0y6ie:2P2K0s1!e-0W6g7L0$0(0*0N04.
Exerice 2: coder/décoder
Le dictionnaire suivant représente un code, les clés sont les lettres de l'alphabet (en majuscule) et les valeurs sont les lettres par lesquelles les remplacer pour effectuer le codage :
| Python |
|---|
| code = {'A': 'Y', 'B': 'S', 'C': 'B', 'D': 'I', 'E': 'T',
'F': 'Q', 'G': 'N', 'H': 'U', 'I': 'X', 'J': 'F',
'K': 'C', 'L': 'W', 'M': 'K', 'N': 'H', 'O': 'E',
'P': 'G', 'Q': 'O', 'R': 'P', 'S': 'L', 'T': 'M',
'U': 'A', 'V': 'J', 'W': 'Z', 'X': 'V', 'Y': 'R',
'Z': 'D'}
|
Par exemple le codage du mot FACILE est : QYBXWT (en effet la clé F est associée à la valeur Q, la clé A à la valeur Y, ...)
- Ecrire une fonction qui prend en entrée une chaine de caractère et renvoie son codage. Si des caractères autres que des lettres majuscules sont présentes dans la chaine (ponctuation, espace, ...) ils sont laissées intactes. Tester votre fonction en déterminant le codage de la phrase
C'EST VRAIMENT SUPER DE FAIRE DU PYTHON !.
- Créer un dictionnaire
decode qui "inverse" le dictionnaire code c'est-à-dire que la valeur associée à Y est A, celle associée à B est S, ...
- Ecrire une fonction qui prend en entrée une chaine de caractère et renvoie son décodage. Tester votre fonction en décodant le message suivant :
LAGTP ! JEAL YJTD PTALLX W'TVTPBXBT.
.128013oP;f 8lkg5:+bry2a1h3tvw=u6e[(Sn]_s-c)7im/4pd050S0B0v0r0N0h0I0f0K0h0r0I0I0y010v0N0R010406050I0z0O0O0r0o0p040E0b0h0z0-0b0F050P0@0_0{0}0=0R04051d161g0P1d0=0S0N0w0#0%0)0+0%0F0j0z0r0j0B0J0R0p0v0t140f0t0N0j0t0h1I0t0v0:050W0n0h0B1p0(0*011H1J1L1J0v1R1T1P0v0o1e1D0#100I0R0r0F0+0q011V1r010e0Y0B0F0r0O0B1P1;1?1{1X1~1T21230:0a0f0c0o0b0R0b0I0N130F0f0U1/0o0o0B0K2o16260F1e0P1D2B1+1-1,1Q0S281s0N0F202l1P1m1o0$1W2L2N0F0b2R1P0R2u1e2z2B2(0?1=2p2T1|2X0o0`0h1P0r1G2u0e0+030H0H0K2Y0B1L2W0b0J0Q0J0s0:0s160r2)2,0;2+272.1X2:2=2@2_0B2{012}2 31332O360J1_040q3c3e1?3g2z2K013l0r2?1e2^0t2`2|2~300U3v2X3x0u0:0u3C2y3f0=3G3j0+3J3L053N3P3r3R3u2M3w370Q0:0Q3!173$3h2-1q3k0b2;3K3n3O3p3Q3t3T3?3V370k0:0k3|2(3%2,3H3+463/3s3S324c35370A0:0A4i3~3(413*433m3M3o3q4q3=343x0M0:0M4z3E4k3i4C3I4E454G474I3;4b4L370g0:0g4Q2A1h2$162R2E0S1-2J3)014r2Q1n1e2#0B2%3f3#3E054r51270N0S0+2~2z3x394G595b4a4s4%381`2c0B5i4r3U4u5m2B3d3 3H0i0:0U0e534-4B2U010x0:0f5D57405G0F0e0:4r0o5L5x4_0/040D5U5F2/0:230)1x0B5!4l5W0:0l5L5K5#3k0n0:0I1+5,4T5G5X0L5|5N1|0b0:0J020j0v0d5;5V4U0F5^045`5T3}545?0+5X5:6j2A0=6p5M0f5h015c2,3x3z3-6u5a6w5j5s6z5n225p6E5r4t6H5v040f6R5=5-6d5%0I0j5j6b6l0164040y6!6U5G0I3z01015L6r2*3G6v6x1?3W3n6^6F6N373X0f5o5q4K3@0J3X6P6S6T5}1|5z040e436*7c3k5R7i621X0b5I042M7m4m5%0B5)1y613H6n6;7z6}5d3^6|6D4#5k763_726J744$7L1P0P3d7a7a6c5G7e0N5C6s7b7n3*7l7$7X637q7s7+6#0F5R317z5.046o4j7D7I0H7F0J4f5g7~6M5l4f7N237P7K4d817S7U7V8g7,7k040O6X6Z7:6+630:0m6)8o7j7)044r7^4U5X0C8z5O7*6?8p1X5X0G7C6s5x7E6y4v7H8a6G8Q886K7J8T0J4w798g7%5y0:320I5+8M6#7B6s6=526@7~804N838S6 0J4N8V8{5l8_3C8$7V8i8w8l6Y8y8u7(6$8r8t2(8%4_7=8x8L8G588@8P0J4)8`6L758c4)8 9t7Q9v8e6Q6S96017e2u0v0z0o159b7u8k8m9a7|8M0P564.504:4}160v4?9Z2H2C0r1S9W0P4;6r0U0W0Y0I04.
Exercice 3: les anniversaires
On dispose d'un dictionnaire Python dans lequel :
- les clés sont les prénoms de différentes personnes. Il n'y a aucun prénom en double
- les valeurs sont les mois de naissance de ces personnes stockées sous forme de nombres entiers (
1 pour janvier, ... 12 pour décembre)
Par exemple :
| Python |
|---|
| naissances = {'Nicolas': 10, 'Antoine': 7, 'Camille': 7}
|
Vous devez écrire une fonction anniversaires(naissances, mois) prenant en arguments le dictionnaire décrit ci-dessus ainsi qu'un numéro d'un mois et renvoyant une liste contenant les prénoms des personnes nées durant ce mois.
La liste renvoyée doit contenir les prénoms attendus dans un ordre quelconque.
Exemples
| Python |
|---|
| >>> anniversaires({'Nicolas': 10, 'Antoine': 7, 'Camille': 7}, 1)
[]
>>> anniversaires({'Nicolas': 10, 'Antoine': 7, 'Camille': 7}, 10)
['Nicolas']
>>> anniversaires({'Nicolas': 10, 'Antoine': 7, 'Camille': 7}, 7)
['Antoine', 'Camille']
>>> anniversaires({'Nicolas': 10, 'Antoine': 7, 'Camille': 7}, 13)
[]
>>> anniversaires({}, 1)
[]
|
Tests sur les résultats triés
En Python, la comparaison de listes prend compte de l'ordre des éléments. Ainsi, les listes [0, 1] et [1, 0] diffèrent, quand bien même elles contiennent les mêmes valeurs.
Afin de s'assurer que la liste renvoyée par la fonction anniversaires contient bien les éléments attendus sans avoir à leur imposer un ordre, on compare donc la version triée du résultat à la valeur attendue. Ceci explique les tests sous la forme assert sorted(anniversaires(naissances, mois)) == résultat_attendu.
.128013oPf lkg5:,bry2a1h3tvw=u6e[(Sn]_s-c)7im./4pd050R0z0t0p0L0f0G0e0I0f0p0G0G0w010t0L0Q010406050G0x0M0M0p0m0n040C0b0f0x0,0b0D050O0?0^0`0|0;0Q04051c151f0O1c0;0R0L0u0!0$0(0*0$0D0h0x0p0h0z0H0Q0n0t0r130e0r0L0h0r0f1H0r0t0/050V0l0f0z1o0%0)011G1I1K1I0t1Q1S1O0t0m1d1C0!0 0G0Q0p0D0*0o011U1q010d0X0z0D0p0M0z1O1:1=1`1W1}1S20220/0a0e0c0m0b0Q0b0G0L120D0e0T1.0m0m0z0I2n15250D1d0O1C2A1*1,1+1P0R271r0L0D1 2k1O1l1n0#1V2K2M0D0b2Q1O0Q2t1d2y2A2%0=1;2o2S1{2W0m0_0f1O0p1F2t0d0*030F0F0I2X0z1K2V0b0H0K0H0q0/0q150p2(2+0:2*262-1W2/2;2?2^0z2`012|2~30322N350H1^040o3b3d1=3f2y2J013k0p2=1d2@0r2_2{2}2 0T3u2W3w0s0/0s3B2x3e0;3F3i0*3I3K053M3O3q3Q3t2L3v360P0/0P3Z163#3g2,1p3j0b2:3J3m3N3o3P3s3S3=3U360i0/0i3{2%3$2+3G3*453.3r3R314b34360y0/0y4h3e1g2#152Q2D0R1,2I3(014q2P1m1d2!0z2$4z3|3D054q4Q260L0R0*2}2y3w383L0e4Y4!494r334%1_2b0z4,4q3T4t371O0O3c3~3G0g0/0T0d3!4T3%400*0v0/0e552z4 4I0D0d0/1=0D1m0z0m0G0W2t0G5d4W3 2T010.040B5t5f583H0/200L0(1=0I0z5s4S5e575w5y0k5t5c5P2.0/0M0b5H5B5V1W5y0J0j5t0;5N5u4*4Z014#2+3w3y3,5/4@3;4/361^0e4=5{4a5}3x4|3c0e685U4k5g0/0Q5n0G132M0G0F5k5m5o5q0z5T5C5w0b0/0w6q5$0*5y0A0E5+5#4k4+5;0F4$363W4)6F3:633?0H3W60214?6G4^4s3V6604696a3h5D51040d426w6b5D0D6d2t2W0M6-6%6s5a042L6^5v5W045G5I0D5K5M2)6x5x0/5*5-5,776E5:5=1=3w3^6L7g4-4_7j4;6T624.6P7k3B6#6#6r1{6)0L545-6$6 3j5F0W73756D6_1{6z7M7G3)6;2N6@5-7z5%0/6B7E7X0*6t040w6v7#786:045Y5!7W785y7b4i7Q5`6G6I0H4e7l7s7o4d7q22816X832A677x8b7$5E046e5o6h5L6k0D5l0u6f6o7`4I7(0N8q6/5j0Q6e0D0R8u5Q0/5A7=6.5w7.4O6?8B7O0/0J6C8F4X7m7}4v806V5|6P4v6S858W6O4c0H8U7w698d6)2t0t0x0m147,8G708g6g8l8j6l8n6n0L2t8P2)0O4V4A4P4C4M150t4F9b2G2B0p1R980O4D5,0T0V0X0G04.
Exercice 4: concours de l'Eurovision
Le concours de l'Eurovision est une compétition qui permet de désigner la meilleure chanson européenne.
Pour cela, chaque pays membre vote pour \(3\) pays de leur choix parmi les pays concurrents, et leur attribue \(1\), \(3\) ou \(5\) points.
Exemple de votes
Ainsi l'Espagne peut décider d'attribuer \(5\) points à la France, \(3\) à l'Estonie et \(1\) à l'Irlande, alors que la France peut attribuer \(5\) points au Portugal, \(3\) à l'Espagne et \(1\) à l'Irlande.
Les votes d'un pays sont représentés par un dictionnaire ayant pour clés les noms des pays et pour valeurs les points attribués. L'ensemble des votes est donc représenté par un tableau de dictionnaires.
Pour déterminer le vainqueur, on souhaite additionner pour chaque pays l'ensemble des points qu'il lui ont été attribués.
Écrire la fonction cumul_votes qui :
- prend en paramètres un tableau
votes
- et renvoie un dictionnaire contenant le cumul des votes.
On garantit que le tableau n'est pas vide et que chaque dictionnaire représente un vote valide.
Exemple d'utilisation
| Python |
|---|
| >>> votes = [
... {"France":5, "Espagne":3,"Irlande":1},
... {"Portugal":5, "Espagne":3,"Irlande":1},
... {"France":5, "Estonie":3,"Irlande":1}
... ]
>>> cumul_votes(votes)
{'France': 10, 'Espagne': 6, 'Irlande': 3, 'Portugal': 5, 'Estonie': 3}
|
Indice
Il s'agit d'un problème d'union de dictionnaires.
.128013oPf 8lkg5:+,bry2a1}h3tvw=u6{e[(Sn9]_s-c)7im./4p0d050X0D0w0r0Q0g0L0e0N0g0r0L0L0z010w0Q0V010406050L0A0R0R0r0o0p040G0b0g0A0=0b0H050T0|0~10120`0V04051i1b1l0T1i0`0X0Q0x0*0,0.0:0,0H0i0A0r0i0D0M0V0p0w0u190e0u0Q0i0u0g1N0u0w0^050#0n0g0D1u0-0/011M1O1Q1O0w1W1Y1U0w0o1j1I0*150L0V0r0H0:0q011!1w010d0%0D0H0r0R0D1U1_1{201$231Y26280^0a0e0c0o0b0V0b0L0Q180H0e0Z1@0o0o0D0N2t1b2b0H1j0T1I2G1:1=1;1V0X2d1x0Q0H252q1U1r1t0+1#2Q2S0H0b2W1U0V2z1j2E2G2-0{1`2u2Y212$0o0 0g1U0r1L2z0d0:030K0K0N2%0D1Q2#0b0M0I0M0s0^0e0s1b0r2.2;0_2:2c2?1$2^2`2|2~0D3001323436382T3b0M1~040e0q3i3k1{3m2E2P013r0r2{1j2}0u2 3133350Z3B2$3D0v3f0v3J2D3l0`3N3p0:3Q3S053U3W3x3Y3A2R3C3c0U3f0U3+1c3-3n2=1v3q0b2_3R3t3V3v3X3z3!3}3$3c0j3f0j432-3.2;3O3=4d3_3y3Z374j3a3c0B3f0B4p453/483;4a3s3T3u3w4x3|393D0P3f0P4G3L4r3o4J3P4L4c4N4e4P3{4i4S3c0f3f0f4X2F4Z472Z4$4b3?3^4f3`4h4z4.3b3f0I4?3M4s3:4{4M3@4O4g4y3#4B3d0W0^0s0W574^4t4%4}5e505g4A3D0s3e045y571m2+1b2W2J0X1=2O5a4y2V1s1j2*0D2,3l3,3L054y5S2c0Q0X0:332E5x3t5!5$515h5)0e2h0D5,5v535z3+4I4`0h0^0Z0d5U2F463O0y3f615Y4_2@0d0^0N0}0A0g0K0x0b0w0D0L67635a0@040F6n5{2@0^6i6k6m445V6u1$6q0O0k670`6A623N5+015%2;3D3F5d6M4,523~3E1 5;5?4R6W6R0T3j0e6*0e6o4#0H0^2z0|0g0#0w0L346e1Y6z2-6,6C0:0b0^0z676 594#6q0C0t6H6t4s6T0K5(3c3(4N7f5@6W3(5:275=6N5-5w7i1U6(3G6+6-5|0^0d4a757A6v041`0p6}5T70016q0m7F7N6/7I0b2R6^7R774`0b65042R7Y4!4`7T6x6l7d7*216q0E7/691$0R0Q0^5n6J683O6q0J7@3O72040S835a7T2s0D0R7L6B7Z7;0^0F6F7c7~637f7h0M407k5#7s7m4k8q6Y7q6!4-6W8r3J6+8F767:3q6:6l6f6@6_6d0R6f7.8m7N7=886.0^7J8e6K8g6D0^827~8H7^71737)8,3P8Y7V0H7X7~6I2/6L8t6O1{3D4m8s8A6V8w4m7p28935.4l7w6)7z7N5}047D0o8/4t0^0Q9k5a7#9m1a8*7G3q0n6:1{1D8W4`6q6s8T8$0:7`5l9A8h047Q9t7S9w042g9J8%6r9S3;6w6j8S8{9F7O0^0O8k8_838o6P4C5*8}7t534D977r6U9a0M4D2G9d8G8+3O9g9i9o8X7I0r7K9V9$9La47+8=7W8!3G9u717$7(9N9#7,9Yagaiaa7?9E8I9W7%a981a98587au8:8a6k8day8i9)4q9+9:8p4U928u6#8w4U9@997u0MaP8E9 8Gar9g0Q60amav8;a6a8a+8:9q7%9s6~ar7T6;8M0r6^6`8Q6|aI046G9*aD0e9,8 4/9/aW534:aVaR8B8w4:9}7ya#a#a_8K6=8Na 8Raq8U0^at9!a,7T8Zb28)a^7N850l74a:9l7Uaf8lby2ub80H3D0Ibbbg945ibTbf9_aXbTbkbm8Fa%0^370L0Db2b4aLb6bQ5x5kaQb!5^5kbZ9;6W5m9cblb(b)7Sbpa|a~8Pbtb2bx7Man8Ya7bu9#azbJ9p8.cka52pbMb5bOb7aN9-3d5_2}7laS5i5y8y98bV9`cCb%9e9#9g2z0w0A0oa@3la089c66?a}8O6{9Z458m0T5X5D5R5F5O1b0w5Ic,2M2H0r1Xc)0T5G6I0Z0#0%0L04.
Exercice 5: décomposition en facteurs premiers
On donne la liste des nombres premiers inférieurs à \(100\) et on s'intéresse à la décomposition en facteurs premiers d'un entier \(n\) compris entre \(2\) et \(100\).
Par exemple:
- \(16 = 2^4\);
- \(72 = 2^3 \times 3^2\);
- \(45 = 3^2 \times 5^1\).
On demande d'écrire la fonction decomposition qui prend en paramètre un entier n compris entre \(2\) et \(100\) et renvoie la décomposition en facteurs premiers de n.
Cette décomposition est représentée par un dictionnaire. Par exemple la décomposition \(3^2 \times 5^1\) est représentée par {3: 2, 5: 1}.
Exemples
| Python |
|---|
| >>> decomposition(72)
{2: 3, 3: 2}
>>> decomposition(16)
{2: 4}
|
.128013oP;f 8lkg5:+,bry2a1}h3tvw=u6{e[(Sn9]_s-c)%7im/4p0d050Y0E0x0s0S0h0M0f0O0h0s0M0M0A010x0S0W010406050M0B0T0T0s0p0q040H0b0h0B0?0b0I050U0}0 11130{0W04051j1c1m0U1j0{0Y0S0y0+0-0/0;0-0I0j0B0s0j0E0N0W0q0x0v1a0f0v0S0j0v0h1O0v0x0_050$0o0h0E1v0.0:011N1P1R1P0x1X1Z1V0x0p1k1J0+160M0W0s0I0;0r011#1x010e0(0E0I0s0T0E1V1`1|211%241Z27290_0a0f0c0p0b0W0b0M0S190I0f0!1^0p0p0E0O2u1c2c0I1k0U1J2H1;1?1=1W0Y2e1y0S0I262r1V1s1u0,1$2R2T0I0b2X1V0W2A1k2F2H2.0|1{2v2Z222%0p100h1V0s1M2A0e0;030L0L0O2(0E1R2$0b0N0t0t3c0_0f0t1c0s2/2=0`2;2d2@1%2_2{2}2 0E3101333537392U3c3e1 040f0r3j3l1|3n2F2Q013s0s2|1k2~0v303234360!3C2%3E0N0w3g0w3K2E3m0{3O3q0;3R3T053V3X3y3Z3B2S3D3d0N0V3g0V3-1d3/3o2?1w3r0b2`3S3u3W3w3Y3A3#3 3%410k3g0k462.3:2=3P3@4g3{3z3!384m3b410C3g0C4s483;4b3?4d3t3U3v3x4A3~3a3(0R3g0R4J3M4u3p4M3Q4O4f4Q4h4S3}4l4V410g3g0g4!2G4$4a2!4)4e3^3`4i3|4k4C4;3e0J3g0J4_3N4v3=4~4P3_4R4j4B3$4E3e0t0X0_5o5b4{4w4*505i535k4D3(3d5q3i0U3k3.4#495u4 4y524T4:405n3G0t3J5F3L4`5J5e4x4,4z4/555Q3c3*040t3,5V5H5X4L4}5!5h4-5j4U5)0t435,455/475I5=2^5v5M4.545l5B4p5,4r614t5Y4(5@51685z563c4G5,4I6f4K5d6i665#5N5%6a410t4X5,4Z6s636u5?6w5^5$695A6B4?5,4^6G5;6I655L6x6l5{4n5n585,5a6T2H2+0E2H2X2K0Y1?2P5e4B2W1t1k6,2-3m5:1k4B6}2d0S0Y0;342F5B3u74766N6n0t202i0E7c6m5|1V5/643r0_6,0T0S0E0p0M6 0f6h4}0b0_0A7x7z220^040F6 0{622G5J7b01772=3(3G5h7P6z6O3F7g287i7Q7d5)7U5V0f7,7y7o0;7s0_5U2:7/017H0n7E7^7;045.7@6V1%7`7|827:0S0_6e814%4}847M3H7F1%7~6F8b4|7G0_7{8f7.86017~3d6 8h0;8e2.8r8c228u806~7^8z3m8B8m8i886E8w8H8o858C8M5q6)8l3P8I3M8K3P7~0r8F3M8x7_8R8q8+8%8W8G8s8Z2G8#5e7~0w5E8X5e8@8g7}8N0w8k8=8T8y8-8A8/8N0V8}968L98048p6g8f7O757%78415+7V9n7X6n3*0f7h7j6!5m3)7m3k7-8_4(7~0V8)7N8Q9i8S9g8t9c958*9M9j8J9b899K729P909G4}7~0k8;9T8?999W920_0C9e9,978,9N8.9:040C9S9L9-9`9a9|0R9?a09^9$9X040R9Z8+a9a49+a79#9.8!aa0gad9U9O8$8N0gah9!8Yak8^aa0J9 3n9l3O7W0L9p3e5~9s9z5P6#427!29aL5(aNaJ7na10K7K8P4vaFaH0N6caK7%7kaN4p9x7#aR6A3ea(5V7L8Xa#7S4F7a9t7(aN4Ga.aQa*9A3(6p3-7^0i0_0!0eaZ9^0z3gbe9P0I0ebb2B0b0T2q2s2DaDa10Gbi4w0_1bbta80_0P0laYbA2va`1|4Wa}a:7Y0N4Xb27$9u5)6D3K9F8+0Ibb0S36aq5e7B047D9{a10D0ubFa_a~a$6Qa)bSaN4?bQbM6nb?7+7-bX7qb$4(b(b*a38s8%b/9f0fbI0I3(6%b@a 9B58b{b4aMcj9D3Hc07^bY040Sc37A7Ccw8D8N0Xca9@bHb;a{5n5p4QaFa+9B5oaPbRci5BcJbVcr8sba040z1N1Zcz7pcuc$0;b(020h0x0dc)3Q0o0_2hbw8 0_bvbGbx047r7t7vc^4(7H0Pc:0bbg041|0Yc:ct0Wd60_c,c.c69/8sctbz8~d30_bE8fa^cbcd5B7fcKa~cMdwcPb|5|dxcU9F7,c1c~dfb)dc7q2A7s7u7wc|c_7Id25?0_cvdTdp04aXdsbwdv6B7U2~cLb5d+dCcmaScN7*9EdHdIb90_cZ25dN04dndk9^b(0Qe0deb+e47Cdjal9|cCd!8ddqcDaicccGbJ6B9rd-dzd/5n9w9yd=a;5*cpd`d`8+cX0Sbde9bjc2eG3Pd7dYe2eddlbZb#eg8n04dr9kb:7ca$5}bLewbNe!clb^cNaUd_eAeAdJ1seRdoehdVeSc%e8e?eTd%c7eadMeJ5ZeQ0bdWeT7Je_3?eIe|830_e~e39Pb(0mc:8uejavd*5na(eqdDaN0ta-eve*6beze.cV9^cX380M0Ef6fdeUfm9meYcH6oe#fx6Bb1fwcRfRfzfAdHe:b!f5f99_f8fcfadKf$7HffeOf0ecay9|a6aCeX9ofN6CfPfU5nbPfTdA6BbUb fXdJeNf=8sc5e0g891ga0_0U0Ue7fKaEemce6Pf}g25nb`g1es3cb~e-fYcsdYdLf;ge9^ctdZe fh0_fjf29H8Nf@dtcEelfMen6$gpgu0tckgtcn5Bcgg59%22cX2A0x0B0pgdg(c%e;f#eW6~0U711n2,1c6/1c0x6;g 2N2I0s1Y6-g}6`7L0!0$0(0M04.
Exercice 6: dictionnaire de J'aime
Lors d'une soirée déguisée un vote est organisé afin d'élire le meilleur costume.
Chaque personne peut attribuer des « J'aime » à aucune, une, ou plusieurs personnes pour son déguisement.
Les résultats de ces « J'aime » sont enregistrés dans un dictionnaire dont les clés sont les prénoms des personnes et la valeur associée est la liste des personnes auxquelles elles ont attribué un « J'aime ».
Par exemple, pour le dictionnaire :
| Python |
|---|
| votes_soiree = {
"Alice": ["Bob", "Carole", "Dylan"],
"Bob": ["Carole", "Esma"],
"Esma": ["Bob", "Alice"],
"Fabien": ["Dylan"],
"Carole": [],
"Dylan":[],
}
|
Comme on peut le voir, Alice a attribué des « J'aime » aux déguisements de Bob, Carole et Dylan. Carole n'a quant à elle attribué aucun « J'aime ».
Vous devez compléter les deux fonctions suivantes :
-
scores_aimes prend en argument le dictionnaire votes tel que décrit plus haut et renvoie le dictionnaire dont les clés sont les personnes présentes lors de la soirée et les valeurs associées le nombre de « J'aime » qu'ils ont reçus ;
-
gagnants prend en argument le dictionnaire votes tel que décrit plus haut et renvoie la liste contenant le nom des vainqueurs du vote (les noms des personnes ayant reçus le plus de « J'aime »).
Exemples
| Python |
|---|
| >>> votes_soiree = {
... "Alice": ["Bob", "Carole", "Dylan"],
... "Bob": ["Carole", "Esma"],
... "Esma": ["Bob", "Alice"],
... "Fabien": ["Dylan"],
... "Carole": [],
... "Dylan":[],
... }
>>> scores_aimes(votes_soiree)
{'Bob': 2, 'Alice': 1, 'Esma': 1, 'Fabien': 0, 'Carole': 2, 'Dylan': 2}
>>> gagnants(votes_soiree)
['Bob', 'Carole', 'Dylan']
|
.128013oP;f 8lkg5:+,brJy2a1éh}3tvw=u6{e[(Sn9]x_s-c)7iqçmR/4p0d050%0G0z0t0U0h0P0f0R0h0t0P0P0C010z0U0#010406050P0D0X0X0t0p0r040J0b0h0D0{0b0K050Z12141618100#04051o1h1r0Z1o100%0U0A0:0=0@0_0=0K0j0D0t0j0G0Q0#0r0z0w1f0f0w0U0j0w0h1T0w0z0~050+0o0h0G1A0?0^011S1U1W1U0z1$1(1!0z0p1p1O0:1b0P0#0t0K0_0s011*1C010e0-0G0K0t0X0G1!1 21261,291(2c2e0~0a0f0c0p0b0#0b0P0U1e0K0f0)1}0p0p0G0R2z1h2h0K1p0Z1O2M1_1{1`1#0%2j1D0U0K2b2w1!1x1z0;1+2W2Y0K0b2$1!0#2F1p2K2M2?11202A2(272,0p150h1!0t1R2F0e0_030O0O0R2-0G1W2+0b0Q0u0!3h0~0f0u1h0t2@2`0 2_2i2|1,2~3032340G3601383a3c3e2Z3h3j24040f0s3o3q213s2K2V013x0t311p330w3537393b0)3H2,3J0Q0y3l0y3P2J3r103T3v0_3W3Y053!3$3D3(3G2X3I3i0Q0!3l0!3=1i3@3t2{1B3w0b2 3X3z3#3B3%3F3*443,460k3l0k4b2?3^2`3U3|4l403E3)3d4r3g460E3l0E4x4d3_4g3{4i3y3Z3A3C4F433f3-0T3l0T4O3R4z3u4R3V4T4k4V4m4X424q4!460g3l0g4)2L4+4f2)4.4j3}3 4n414p4H4_3j0L3l0L4~3S4A3`534U3~4W4o4G3+4J3j0u0$0~5t5g504B4/555n585p4I3-0u0u5v3n0Z3p3?4*4e5z544D574Y4^455s3L0u3O5L3Q4 5P5j4C4;4E4@5a5W3h3/040u3;5#5N5%4Q525*5m4=5o4Z5/3i5v4a5^4c5O5{2}5A5S4?595q5G4u5=4w664y5(4-5}566d5E5b3h4L5=4N6k4P5i6n6b5+5T5-6f460u4$5=4(6x686z5|6B5~5,6e5F6G4{5=4}6L5`6N6a5R6C6q614s5s5d5=5f6Y5h4,6O6$6Q6D6S6s0s5u046{5x6m6=5l6p605V6*0Q0s5I6}5K5M676Z6;6#725C5U5.760s3L7m6 694h6?735D6)5r775;0s5@7c6l7q4S7s7i6E6T3K486}657B6y7f7r7h5 7u757w0s6h7W7p6!7Q4:6@6(7U3-0s6u7+7Z7P7E7R6R6r5/0s6I7^7.517g7$7t7j6F3K6V0s6X7N3R1s2;1h2$2P0%1{2U5j4G2#1y1p2:0G2=3r5_1p4G8n2i0U0%0_392K5G3z8u8w6_62252n0G8C7?76793=7D010i0~0)0e8p70270B3l8T8N0K0e0~0P3b2F0P0O0,2e0P8Y7!0_0}040I8/7/3V0~0A0b0z0G8.7d8s7|1,8=0S0l8p10915P8B018x2`7*8A8v9d8D7l8F2d8H9j8J7V1!5^8N8W3M0f9x8^930_0P0%0~019F989z0f9c9e213-5;5m9K9k7w3/0f8G8I7v9N9s5M8N9C3l9x0f0Y2b8|0U1)1(2B0U2H0U1f2c0U2F2B1f0z0f1(0/0;0v0/0P9|9~8 0f0#0G0pa40K2Y0P0n9H9a3T9Q8y467K9P9i7H6s489U9n9W7)am9Z923U9$9w9x0*a60/0A3X0G0Daba69U0b0X0o9`2Ca9ab9@a70V0D0Ua6aK0fa50t1=0p0U0o0D0v2Ba70q008,0Gah2^ajap0Oal3j6haoav7k7w4uat2eb1810Qa 9t8:01aB9(0f9F01a^8oa`8Ca}0Q6ub09p9X4K9mb6braw3jbp5#bf8U3w0~0o0-218p0fbC0_0b0~0CbIbK018=0F0xbj87bl9jbn6Ibqaq5/4$b59ob$76b!bA9(bQ8P040e4ibP8Z0~aTac2Yb^bc0b9v2Xb~8_0K8{8}8 9I5j8=979199a_4Aak9f4`9hb77I0Q4{b)cl6s6V3PbfbBb_04bF1Ec94-8=0HcA5|b`aab|a@aibc8=0Mc39A01bM04bO91bJ8N0X0U0~0$bV2L9ba{bn6,b#9R3-5dcpbwb2c-aycebkcgc(ci5s6|c+9q5G5uc/b+7w5taycvbcb;b?0pcO4BcGaUadcJ2?cVb c11gcUbQc5048|8~90cf8_cbc#azch9M6G8L339Qc dBbub*c,dG2M3pcub/8Nd9b@dncwb{aV3a1P0U2xdh3rdj8_c00~c2dSbcdpdrc8cKdv0~cDd:cPdpdUdgcE27cMcc6ld@9Jc`dA5Xckc:b85ZdHcq623LctdNcudobEbGdmducPcCd|bD04d`2YdW0bdY9-eo8;0~cNd+d%bNdc5)eicze1cad=ex8`eqcHdV0RdXdZeLcMeE4-cR0meV52cX5vdxc%bmc{5:e6d35G9T9Ve7cm5?d6dOd80~2F0zaKekd#ehcxeje%bX9L0K5GandDa{dF5sase:e-6Gan5#c@bWc_e)e43ha f9eb8Kb4fedJ5sba3pfjc$f4a|e*0ubpfqe;6sfEeafH62bz9!e_048ReL9vbJeI6n8#040j1I2c0K0zdtc^d;8?eLd-c7f(fkf*96f3flbYfDb!fGff5sb(fufb3hb-fO8_fTb/fV52aBbhf?8te3f66Ue,fv3hcof bs5scsbb8_be9(9*0K9,9.331W0P8~a/0/era70t0r219}9/0#1c0/2F0W0Da/0f0l0fa;a?gb2Adzge6+ggg00uc.gkbx3hc*gocPgq9xgacd9IgX7*c}f{gh6{fKf|77c}b.9ycwcybHeBcPcRcTdif08%4i8 8+0U8-eT0~8@g72}c6dshh040SgVe2fmgY77dChsfL7l5Id2g`8Lh0d$d^0~150N0UeZ27h7hL1,e#04c!g;e1g?467mg!gl7724hBg0hXdLaChF3UdQdbh5ddeNdfb}h/5jd(04d*h9h2f2hk940~d 4dhUgd7*9Og_h%e/auhy7V9OhEd78_b;0U8Sh@6neGh4el3Uenh 3{decIhoeAh|b 0~020j0z0dhOit04hIhKisbRi1hrhV7JhYg)0sfdibg}iSe@efe^c4hH0thJiFcQeDilcFf1eHipeJ04d?i/imh;iviKeUhTipiO77fphxiVftiUg`fx3si4ht7*fFj1g`4Lh$hZ7+iXh+eF04gx8~0OfZ0jf#f%i(hNi+d}eKiKdp2,0Xi(h-i(jzaOjtdljEine~3Rjj4-iiikiyi!i-iof)emjxi?i,jAiwjtbNh8e cwiIj#i|jVjcbn7^iQc;hWf~j4h%g2j7i}i5hWcsi8jggjj_k2jib:e`0*e}jJjldYjnjpjrf/5%9a0Z8r888m8a8j1h0z8dkq2S2N0t1%kn0Z8b990)0+0-0P04.
Exercice 7: Pangramme
Un pangramme est une phrase contenant toutes les lettres de l'alphabet.
Il existe dans l'alphabet latin utilisé en français 26 lettres minuscules « usuelles ». Si l'on tient compte des lettres accentuées et des ligatures (à, â, ..., ç, æ et œ), le décompte passe à 42 caractères minuscules distincts.
On se limite dans cet exercice aux lettres minuscules usuelles de l'alphabet : a, b, c, ..., z.
Un exemple classique de pangramme est « portez ce vieux whisky au juge blond qui fume ». Chaque lettre y apparaît au moins une fois.
Par contre « portez un vieux whisky au juge blond qui fume » n'est pas un pangramme ; il manque la lettre c.
Vous devez écrire une fonction est_pangramme qui :
- prend en paramètre une chaîne de caractères
phrase,
- renvoie le booléen indiquant si cette chaîne est un pangramme ou non.
On fournit la fonction indice qui prend en argument une lettre entre "a" et "z" et renvoie son indice dans l'alphabet (en débutant à 0 pour "a"). Il n'est pas indispensable de l'utiliser.
Exemples
| Python |
|---|
| >>> indice("a")
0
>>> indice("z")
25
>>> est_pangramme("portez ce vieux whisky au juge blond qui fume !")
True
>>> est_pangramme("portez un vieux whisky au juge blond qui fume !")
False
>>> est_pangramme("jugez que ce texte renferme l'alphabet, dix voyelles, k et w")
True
>>> est_pangramme("jugez que ce texte renferme l'alphabet, dix voyelles et w")
False
|
.128013oP;f 8lkg5:zFbry2a1h3tvwT=u6e[(*Sn9]_s-c)7im/4p0d050X0D0w0s0R0h0M0f0O0h0s0M0M0A010w0R0V010406050M0B0S0S0s0p0q040H0b0h0B0=0b0I050T0|0~10120`0V04051i1b1l0T1i0`0X0R0x0*0,0.0:0,0I0j0B0s0j0D0N0V0q0w0u190f0u0R0j0u0h1N0u0w0^050#0o0h0D1u0-0/011M1O1Q1O0w1W1Y1U0w0p1j1I0*150M0V0s0I0:0r011!1w010e0%0D0I0s0S0D1U1_1{201$231Y26280^0a0f0c0p0b0V0b0M0R180I0f0Z1@0p0p0D0O2t1b2b0I1j0T1I2G1:1=1;1V0X2d1x0R0I252q1U1r1t0+1#2Q2S0I0b2W1U0V2z1j2E2G2-0{1`2u2Y212$0p0 0h1U0s1L2z0e0:030L0L0O2%0D1Q2#0b0N0t0C3b0^0f0t1b0s2.2;0_2:2c2?1$2^2`2|2~0D3001323436382T3b3d1~040f0r3i3k1{3m2E2P013r0s2{1j2}0u2 3133350Z3B2$3D0N0v3f0v3J2D3l0`3N3p0:3Q3S053U3W3x3Y3A2R3C3c0N0U3f0U3,1c3.3n2=1v3q0b2_3R3t3V3v3X3z3!3~3$400k3f0k452-3/2;3O3?4f3`3y3Z374l3a400C3f0C4r473:4a3=4c3s3T3u3w4z3}393%0Q3f0Q4I3L4t3o4L3P4N4e4P4g4R3|4k4U400g3f0g4Z2F4#492Z4(4d3@3_4h3{4j4B4:3d0J3f0J4^3M4u3;4}4O3^4Q4i4A3#4D3d0t0W0^5n5a4`4v4)4 5h525j4C3%0t0t5p3h0T3j3-4!485t4~4x514S4/3 5m3F0t3I5F3K4_5J5d4w4+4y4.545Q3b3)040t3+5V5H5X4K4|5!5g4,5i4T5)0t425,445/465I5=2@5u5M4-535k5A4o5,4q614s5Y4%5@50685y553D5p4H6f3l1m2+1b2W2J0X1=2O5d4A2V1s1j2*0D2,6s622F054A6I2c0R0X0:332E5A3t6Q6S695z405C0f2h0D6Y6m5|1U5/641$0i0^0Z0e5:6O4{210y3f6^6h5?0e0^2R1r0O0D6~6/0:0@040F775c6i0^0S2R0B0M0O0B1Y7d4$4|7a0P0l6^0`6K6_0f6X016T2;3%3F5g7z5%6a401~6%276)7A6Z6n7E5V0f7T0f6 216;042z0w0B0p1a7w7V783P0o0^4c0X7o6`1$7a7c7w7W3q7g7i7k7m767_7+7r6^7*7e4|0b0^0N847`3=7-047/7;3O7@8h5d0M3F010s018k4%837w7v2/3N7G0L6U405+7F6R7O6+4m3d3)7L286*5{8H3(6-3j8v6s8x8E7B1{3%5~8D8M5P8O428K7N7H6!3d8Z5V8S3L5J8y8A3d6c8!8F8N5l0N4o8)8#5(8O8_6.867X6=3v8r4|6|3G9a2@71040D0M0w0L2;0j0p27289e7?0^7^8w967{040V3V0-809v7p217r7t8u8h8?7C4E6W8V7P5)4F908{8$8}4F2G3j7U859E9x6G0M25750M8b7+88040A9,9w790^0E9r0:0i0O0^0n3R9(9_017a0K9;9#0:9.0Ga57=0:7h0^0r6q6g814u9K8X404W4P8y8G8}4W9S8+6nan3J8:6L8U6Y8@0N4=ao9Oaq3%4=at9P8OaE3J9Z8c017Y0e4caa4v0^0O100s2B0D2zaV5d0b9c2Ra(7f9y9Aa0aia6a20^9Hah9D2uak0I3%57aF917I561 6(b28,0Nb0aO9Z7UaQ7Y0R6@7)aQ8m0^8o8qbi9-0^020h0w0d9:bo9=3PaXaZa#a%bwa?9.brbtbv2-9!ab01bk04010mbna{8ia^7u9J9OaC5n9Nb76nbZaKaH6#5o9X3Gbcb.aQ0I0^9%9)9ia17a9^a=bLb;04730R75b_9ta1b~aY9obB9C8Tbx7ra4bDbL9.bI3lbK3O9{0^0z0p0Bca5Ib|7ybX9L5m5Cb19T928}5Bb57Mb#5|cyaxbWaBcw3b7E2}ap8|5A7Kb6cAb3cN8Qb-7Tbe0^aT0pa-5?72c)21a*727(bJb:8e9o1zcrazccc4ct5dad04afc3047sbVcta}5A8CcPaGcR6#8JcUau5|8C7Sb.ck5dbfbhc;9-9c2$0wc,9$2z9(0I9*d2b{bS5Zc+c}8s0^0Ka_47d6cval5m8ZdacG8O5}cE8LcVb8dTb,dkbcc#7Z0!7$c:cjbe9|049~0(c_3mdLcLdN3b8_dQdWb$8 dfaLcC948RcK7ObY9W8`dgdS9Rd b)5me7djc!7+7Y7!d)du9`d-cocqd52/0T6N6t6H6v6E1b0w6yez2M2H0s1Xew0T6w7v0Z0#0%0M04.
Astuce
On pourra utiliser une structure de données, une liste de booléens ou un dictionnaire par exemple, afin de garder trace des lettres lues lors du parcours de la chaîne de caractères.
A retrouver sur Codex
# Tests(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)