{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Premiers exemples" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "dressing = {\"pantalons\":3, \"pulls\":4, \"tee-shirts\":8}" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "4" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dressing[\"pulls\"]" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "vocabulaire = {\"navigateur\":\"browser\", \"précédent\":\"back\", \"suivant\":\"forward\"}" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'forward'" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vocabulaire[\"suivant\"]" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": true }, "outputs": [], "source": [ "AlanTuring = {\"naissance\":(23,6,1912),\"décès\":(12,6,1954),\"lieu naissance\":\"Londres\", \"lieu décès\":\"Wilmslow\"}" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(12, 6, 1954)" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "AlanTuring[\"décès\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Définition d'un dictionnaire\n", "Un dictionnaire est une donnée composite qui **n'est pas ordonnée**. \n", "Il fonctionne par un système de `clé:valeur`. \n", "Les clés, comme les valeurs, peuvent être de types différents.\n", "Un dictionnaire est délimité par des accolades. \n", "Rappel :\n", "- crochets [ ] -> listes\n", "- parenthèses ( ) -> tuples\n", "- accolades { } -> dictionnaires\n" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'navigateur': 'browser', 'précédent': 'back', 'suivant': 'forward'}" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vocabulaire" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "dict" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(vocabulaire)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Il est possible d'obtenir la liste des clés et des valeurs avec la méthode `keys()` et la méthode `values`." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "dict_keys(['pantalons', 'pulls', 'tee-shirts'])" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dressing.keys()" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "dict_values(['browser', 'back', 'forward'])" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "vocabulaire.values()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Création d'un dictionnaire vide\n", "On crée un dictionnaire vide par l'instruction :" ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": true }, "outputs": [], "source": [ "monDico = dict()" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "dict" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(monDico)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "ou plus simplement de cette manière :" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": true }, "outputs": [], "source": [ "unAutreDico = {}" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "dict" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "type(unAutreDico)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Ajout / Modification d'un élément dans un dictionnaire\n", "Pas besoin d'une méthode `append()`, il suffit de rajouter une paire `clé : valeur`" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": true }, "outputs": [], "source": [ "dressing[\"chaussettes\"] = 12" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'pantalons': 3, 'pulls': 4, 'tee-shirts': 8, 'chaussettes': 12}" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dressing" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On peut évidemment modifier un dictionnaire existant (ce n'est pas un tuple !)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": true }, "outputs": [], "source": [ "dressing[\"chaussettes\"] = 11" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'pantalons': 3, 'pulls': 4, 'tee-shirts': 8, 'chaussettes': 11}" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dressing" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Suppression d'une valeur\n", "On utilise l'instruction `del` (déjà rencontrée pour les listes)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": true }, "outputs": [], "source": [ "del dressing[\"chaussettes\"]" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'pantalons': 3, 'pulls': 4, 'tee-shirts': 8}" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dressing" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Exercice :\n", "Créer une fonction `achat(habit)` qui augmente de 1 le nombre d'habits (pantalon, pull ou tee-shirt) de mon dressing." ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def achat(habit):\n", " '''votre code'''\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Utilisation :" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'pantalons': 3, 'pulls': 4, 'tee-shirts': 8}\n", "{'pantalons': 4, 'pulls': 4, 'tee-shirts': 8}\n" ] } ], "source": [ "print(dressing)\n", "achat(\"pantalons\")\n", "print(dressing)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Test d'appartenance à un dictionnaire\n", "Le mot `in` permet de tester l'appartenance d'une clé à un dictionnaire. Un booléen est renvoyé." ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\"cravates\" in dressing" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\"pulls\" in dressing" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Utilisation de `in` pour d'autres types construits (listes, tuples, chaines de caractères...)" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": true }, "outputs": [], "source": [ "voyelles = (\"a\", \"e\", \"i\", \"o\", \"u\", \"y\")" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\"y\" in voyelles" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\"z\" in voyelles" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mot = \"vacances\"\n", "\"k\" in mot" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# À vous de jouer: exercices sur les dictionnaires" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "#### Exercice 1 : création de dictionnaires" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On reprend la liste d'élèves précédente:" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "collapsed": true }, "outputs": [], "source": [ "élèves = [\n", " (\"Sophie\", \"Jacquemin\", 3, 6, 2003),\n", " (\"Zoé\", \"Ledoux\", 1, 2, 2004),\n", " (\"Adrien\", \"Millet\", 8, 6, 2003),\n", " (\"Gilles\", \"Hebert\", 11, 12, 2003),\n", " (\"Andrée\", \"Millet\", 14, 1, 2005),\n", " (\"Françoise\", \"Auger\", 30, 5, 2003),\n", " (\"Margot\", \"Dias-Laurent\", 30, 6, 2003),\n", " (\"Thimothée\", \"Lebreton\", 2, 10, 2004),\n", " (\"Audrey\", \"Monnier\", 30, 12, 2006),\n", " (\"Élisabeth\", \"Lebrun\", 27, 4, 2003)\n", "]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Écrire une fonction ```élèves_tuples_nommés(tableau_élèves)``` prenant pour paramètre un tableau au format précédent, et renvoyant un tableau similaire où chaque tuple a été remplacé par un dictionnaire. Les clés seront ```\"prénom\", \"nom\", \"jour\", \"mois\", \"année\"```" ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def élèves_tuples_nommés(tableau_élèves, liste_clés):\n", " \"\"\"Écrire la documentation ici\"\"\"\n", " \n", " # Écrire votre code ici" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "N'oubliez pas de tester votre code, en incluant la liste des clés correspondant aux tuples définissant les élèves:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [ "raises-exception" ] }, "outputs": [], "source": [ "résultats = élèves_tuples_nommés(élèves)\n", "assert résultats[0] == { \"prénom\": \"Sophie\", \"nom\": \"Jacquemin\",\n", " \"jour\": 3, \"mois\": 6, \"année\": 2003}\n", "résultats" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Assurez-vous que la cellule précédente affiche un tableau contenant les dictionnaires définissant chaque élève." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "#### Exercice 1 bis : création de dictionnaires plus générale" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On reprend la liste d'élèves précédente:" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "collapsed": true }, "outputs": [], "source": [ "élèves = [\n", " (\"Sophie\", \"Jacquemin\", 3, 6, 2003),\n", " (\"Zoé\", \"Ledoux\", 1, 2, 2004),\n", " (\"Adrien\", \"Millet\", 8, 6, 2003),\n", " (\"Gilles\", \"Hebert\", 11, 12, 2003),\n", " (\"Andrée\", \"Millet\", 14, 1, 2005),\n", " (\"Françoise\", \"Auger\", 30, 5, 2003),\n", " (\"Margot\", \"Dias-Laurent\", 30, 6, 2003),\n", " (\"Thimothée\", \"Lebreton\", 2, 10, 2004),\n", " (\"Audrey\", \"Monnier\", 30, 12, 2006),\n", " (\"Élisabeth\", \"Lebrun\", 27, 4, 2003)\n", "]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Écrire une fonction ```élèves_tuples_nommés(tableau_élèves, liste_clés)``` prenant pour paramètre un tableau au format précédent et une liste de clés, et renvoyant un tableau similaire où chaque tuple a été remplacé par un tuple nommé, c'est-à-dire un dictionnaire. On utilisera la liste de clés pour créer chaque dictionnaire." ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def élèves_tuples_nommés(tableau_élèves, liste_clés):\n", " \"\"\"Écrire la documentation ici\"\"\"\n", " \n", " # Écrire votre code ici" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "N'oubliez pas de tester votre code, en incluant la liste des clés correspondant aux tuples définissant les élèves:" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "collapsed": true }, "outputs": [], "source": [ "élèves_tuples_nommés(élèves, [\"prénom\", \"nom\", \"jour\", \"mois\", \"année\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Assurez-vous que la cellule précédente affiche un tableau contenant les dictionnaires définissant chaque élève." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "#### Exercice 2: décompte du nombre d'occurences" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Les dictionnaires facilitent énormément l'écriture de certains algorithmes." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Écrivez une fonction ```décompte_années(tableau_élèves)``` prenant pour paramètre le résultat de l'exercice précédente (un tableau contenant des dictionnaires pour chaque élève), et renvoyant un dictionnaire associant à chaque année de naissance le nombre d'élèves nés cette année là. On n'incluera uniquement des années ayant connu au moins une naissance." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Indication:** Il va falloir différencier le cas où une année est déjà stockée dans le dictionnaire ou non:\n", "* Si elle y est déjà, on incrémente le compteur associé de 1;\n", "* Si elle n'y est pas déjà, on la rajoute dans le dictionnaire, avec une valeur égale à 1." ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def décompte_années(tableau_élèves):\n", " \"\"\"Écrire la documentation de la fonction ici\"\"\"\n", " \n", " pass # Écrire votre code ici" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On s'assure que votre fonction donne les bons résultats:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [ "raises-exception" ] }, "outputs": [], "source": [ "clés = [\"prénom\", \"nom\", \"jour\", \"mois\", \"année\"]\n", "élèves_dict = élèves_tuples_nommés(élèves, clés)\n", "résultat = décompte_années(élèves_dict)\n", "assert résultat[2003] == 6\n", "assert résultat[2004] == 2\n", "assert résultat[2005] == 1\n", "assert résultat[2006] == 1\n", "assert len(résultat) == 4" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "#### Exercice 3: encore des occurences !" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Écrire une fonction ```occurences(tableau)``` prenant en paramètre un tableau (de valeurs dont le type n'est pas spécifié) et renvoyant un dictionnaire où les clés sont les valeurs du tableau, et chaque clé est associée aux nombre d'occurences dans le tableau." ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def occurences(tableau):\n", " \"\"\"Écrire la documentation de la fonction ici\"\"\"\n", " \n", " # Écrire votre code ici" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Quelques tests que votre fonction doit passer sans encombre pour être validée:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [ "raises-exception" ] }, "outputs": [], "source": [ "assert occurences([1, 2, 3, 4]) == {1: 1, 2: 1, 3: 1, 4: 1}\n", "assert occurences([1, 2, 2, 3, 3, 3, 4, 4, 4, 4]) == {1: 1, 2: 2, 3: 3, 4: 4}\n", "assert occurences([1, 3, 4, 4, 2, 3, 4, 2, 4, 3]) == {1: 1, 2: 2, 3: 3, 4: 4}\n", "assert occurences(\"pascal\") == {\"p\": 1, \"a\": 2, \"s\": 1, \"c\": 1, \"l\": 1}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "#### Exercice 4: comparaison de deux tableaux" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On revient ici vers l'exercice consistant à déterminer si deux tableaux sont identiques, mais sans utiliser d'algorithme de tri.\n", "\n", "On propose au contraire de créer pour chaque tableau un dictionnaire associant à une valeur donnée du tableau le nombre de fois où elle apparaît dans ce tableau: c'est ce que l'on a fait dans l'exercice précédent !\n", "\n", "Il ne reste ensuite qu'à comparer les dictionnaires en s'assurant que toutes les clés présentes dans un des dictionnaires le sont aussi dans l'autre, et avec le même nombre d'occurences." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Attention:** il est possible de comparer deux dictionnaires avec la syntaxe ```dict1 == dict2``` qui fait exactement ce que l'on veut. Mais on demande ici de réaliser cette comparaison *à la main*, en utilisant un algorithme adéquat." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "La fonction doit renvoyer ```True``` si les tableaux contiennent les mêmes éléments (avec les mêmes effectifs), ```False``` sinon. Les dictionnaires cités ci-dessus servent à déterminer l'égalité, mais ne doivent pas être visibles en dehors de la fonction: idéalement, l'utilisateur de la fonction ne devrait avoir aucune idée de l'algorithme utilisé, ce qui permet notamment de changer d'algorithme de manière totalement transparente sans qu'il y ait la moindre incidence sur le reste du code. D'où l'importance d'avoir un cahier des charges précis pour une fonction: valeurs attendues, valeurs renvoyées, contraintes diverses sur ces valeurs." ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def tableaux_égaux(t1, t2):\n", " \"\"\"Écrire la documentation de la fonction ici\"\"\"\n", " \n", " # Écrire votre code ici" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [ "raises-exception" ] }, "outputs": [], "source": [ "# N'oubliez pas de tester votre fonction\n", "t1 = [1, 1, 2, 1, 0, 1, 0, 0]\n", "t2 = [2, 0, 0, 1, 1, 1, 0, 1]\n", "t3 = [0, 0, 1, 1, 1, 1, 2]\n", "\n", "assert tableaux_égaux(t1, t2) == True\n", "assert tableaux_égaux(t1, t3) == False" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "#### Exercice 5: Fréquences des lettres dans un texte" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Le dernier test de l'exercice précédent montre que votre fonction occurence fonctionne en particulier aussi sur les chaînes de caractères: en effet, celles-ci ressemblent beaucoup à des tableaux de caractères (et, d'une certaine manière, peuvent souvent être considérées comme telles). En particulier, on peut accéder au $n$-ième caractère d'une chaîne ```S``` par la syntaxe ```S[n]```, comme s'il s'agissait d'un tableau. De ce fait, la fonction occurence ne fait aucune différence entre un tableau et une chaîne de caractères.\n", "\n", "**Remarque importante:** À la différence des tableaux cependant, les chaînes de caractères sont **immuables**: il n'est pas possible d'en modifier le contenu une fois la chaîne créée. Cela présente des avantages pour l'implémentation du langage python: celle-ci peut optimiser le stockage des chaînes de caractères en mémoire, par exemple. \n", "\n", "C'est notamment cet aspect immuable des chaînes de caractères qui fait que l'on peut les utiliser comme clés dans un dictionnaires, contrairement à des tableaux." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**But de l'exercice:** Dans cet exercice, votre tâche consiste à utiliser le résultat de la fonction ``occurences`` sur un texte (stocké dans une chaîne de caractères) et à afficher les fréquences des lettres. Quelques contraintes:\n", "* On ne calculera les fréquences que pour les lettres de l'alphabet: la somme de ces fréquences doit valoir 1 (cela signifie que l'on ignorera les caractères autre que les lettres de l'alphabet);\n", "* On ne distinguera pas les lettres majuscules des lettres minuscules: un ```\"A\"``` et un ```\"a\"``` seront comptabilisés comme une seule et même lettre;\n", "* Dans le même ordre d'idée, on considèrera qu'un ```\"é\"``` est la lettre ```\"e\"``` (on enlève les accents), de même pour tous les autres caractères accentués;\n", "* Le ```\"ç\"``` est considéré bien entendu comme un ```\"c\"```;\n", "* Enfin, les fréquences seront arrondies à trois chiffres après la virgule. On peut pour cela utiliser la fonction ```round```:\n", "\n", "```\n", ">>> round(0.123456789, 3)\n", "0.123\n", "```\n", "\n", "Comme il est difficile de saisir les lettres accentuées en majuscule sous windows (contrairement à linux qui fait cela très naturellement), on peut utiliser l'astuce suivante pour disposer de ces caractères:" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'éèêëàâäôöîïùûüçÉÈÊËÀÂÄÔÖÎÏÙÛÜÇ'" ] }, "execution_count": 55, "metadata": {}, "output_type": "execute_result" } ], "source": [ "accents = \"éèêëàâäôöîïùûüç\"\n", "accents = accents + accents.upper()\n", "accents" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Une astuce géniale pour se faciliter la vie: les dictionnaires permettent dans certains cas de s'épargner de nombreuses lignes de code. Ici, on imagine très bien qu'il y aurait un long enchaînement de ```if ... elif ... elif... ... ... ... else...``` afin de traîter ce problème d'accents.\n", "\n", "On peut avantageusement remplacer ce code très compliqué à lire par l'usage d'un simple dictionnaire:" ] }, { "cell_type": "code", "execution_count": 56, "metadata": { "collapsed": true }, "outputs": [], "source": [ "traduction_accents = [(\"éèêë\", \"e\"), (\"àâä\", \"a\"), (\"ôö\", \"o\"), (\"îï\", \"i\"), (\"üûù\", \"u\"), (\"ç\", \"c\")]\n", "dictionnaire_accents = {}\n", "for lettres, traduction in traduction_accents:\n", " for l in lettres:\n", " dictionnaire_accents[l] = traduction\n", " dictionnaire_accents[l.upper()] = traduction" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On obtient avec ces quelques lignes le dictionnaire suivant:" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'é': 'e',\n", " 'É': 'e',\n", " 'è': 'e',\n", " 'È': 'e',\n", " 'ê': 'e',\n", " 'Ê': 'e',\n", " 'ë': 'e',\n", " 'Ë': 'e',\n", " 'à': 'a',\n", " 'À': 'a',\n", " 'â': 'a',\n", " 'Â': 'a',\n", " 'ä': 'a',\n", " 'Ä': 'a',\n", " 'ô': 'o',\n", " 'Ô': 'o',\n", " 'ö': 'o',\n", " 'Ö': 'o',\n", " 'î': 'i',\n", " 'Î': 'i',\n", " 'ï': 'i',\n", " 'Ï': 'i',\n", " 'ü': 'u',\n", " 'Ü': 'u',\n", " 'û': 'u',\n", " 'Û': 'u',\n", " 'ù': 'u',\n", " 'Ù': 'u',\n", " 'ç': 'c',\n", " 'Ç': 'c'}" ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dictionnaire_accents" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On est très heureux de s'être épargné la saisie de ce dictionnaire à la main. Si on veut connaître la traduction d'une lettre accentuée quelconque, il suffit d'interroger le contenu du dictionnaire:" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'e'" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dictionnaire_accents[\"é\"]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Indication:** Il y a plein de façons de réaliser la tâche demandée. Une idée relativement simple consiste à récupérer le dictionnaire fourni par ```occurences```, puis à créer un nouveau dictionnaire n'incluant que les lettres minuscules (attention, les lettres majuscules et les éventuels accents/cédilles doivent être rajoutées au décompte de la lettre minuscule correspondante).\n", "\n", "On peut partir du principe que dans ce nouveau dictionnaire, si une lettre n'apparaît pas dans le texte alors son effectif sera égal à zéro: autrement dit, toutes les lettres minuscules seront présentes dans le dictionnaire, avec l'effectif correspondant dans le texte.\n", "\n", "Le calcul des fréquences est ensuite relativement simple, puisqu'il n'y a plus de clé à ignorer." ] }, { "cell_type": "code", "execution_count": 59, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def fréquences_lettres(texte):\n", " \"\"\"Écrire la documentation de la fonction ici\"\"\"\n", "\n", " # Écrire votre code ici" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Voici un exemple permettant de tester votre code:" ] }, { "cell_type": "code", "execution_count": 60, "metadata": { "collapsed": true }, "outputs": [], "source": [ "texte = \"\"\"\n", "Maître Corbeau, sur un arbre perché,\n", " Tenait en son bec un fromage.\n", " Maître Renard, par l'odeur alléché,\n", " Lui tint à peu près ce langage :\n", " Et bonjour, Monsieur du Corbeau,\n", " Que vous êtes joli ! que vous me semblez beau !\n", " Sans mentir, si votre ramage\n", " Se rapporte à votre plumage,\n", " Vous êtes le Phénix des hôtes de ces bois.\n", "À ces mots le Corbeau ne se sent pas de joie,\n", " Et pour montrer sa belle voix,\n", " Il ouvre un large bec, laisse tomber sa proie.\n", " Le Renard s'en saisit, et dit : Mon bon Monsieur,\n", " Apprenez que tout flatteur\n", " Vit aux dépens de celui qui l'écoute.\n", " Cette leçon vaut bien un fromage sans doute.\n", " Le Corbeau honteux et confus\n", " Jura, mais un peu tard, qu'on ne l'y prendrait plus.\"\"\"" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [ "raises-exception" ] }, "outputs": [], "source": [ "assert fréquences_lettres(texte) == {\n", " 'a': 0.076, 'b': 0.029, 'c': 0.031, 'd': 0.025, 'e': 0.172, 'f': 0.008, 'g': 0.013, 'h': 0.01,\n", " 'i': 0.05, 'j': 0.008, 'k': 0.0, 'l': 0.044, 'm': 0.031, 'n': 0.065, 'o': 0.073, 'p': 0.032,\n", " 'q': 0.01, 'r': 0.078, 's': 0.071, 't': 0.069, 'u': 0.078, 'v': 0.017, 'w': 0.0, 'x': 0.008,\n", " 'y': 0.002, 'z': 0.004}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Comparez les résultats obtenus avec les fréquences usuelles des lettres de la langue française (bien connues des joueurs de scrabble par exemple). On peut les trouver sur wikipedia par exemple: https://fr.wikipedia.org/wiki/Fr%C3%A9quence_d%27apparition_des_lettres_en_fran%C3%A7ais" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "#### Exercice 6 : Les misérables" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On souhaite reprendre l'exercice précédent, mais sur un texte un peu plus long afin que le calcul des fréquences soit plus pertinent (c'est la loi des grands nombres: plus l'effectif total est important, plus les fréquences tendront à converger vers les fréquences théoriques de la langue française).\n", "\n", "On se propose ici de calculer la fréquence des lettres sur le texte intégral des *Misérables* de Victor Hugo. Celui-ci est stocké dans le fichier ```misérables.txt```. Voici la syntaxe permettant de lire les lignes d'un fichier sur le disque dur:" ] }, { "cell_type": "code", "execution_count": 62, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "62243" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "with open(\"misérables.txt\", \"r\") as fichier:\n", " misérables = []\n", " for ligne in fichier:\n", " misérables.append(ligne)\n", " \n", "len(misérables)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "La première ligne sert à ouvrir le fichier en lecture seule (paramètre ```\"r\"```). La variable référençant le fichier ouvert est ```fichier```.\n", "\n", "La boucle ```for``` sert à parcourir l'ensemble des lignes du fichier. Celles-ci sont stockées dans le tableau ```misérables```.\n", "\n", "On constate que le fichier contient plus de 62000 lignes !" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Attention:** N'essayez surtout pas d'afficher le contenu du tableau dans jupyter lab. Votre environnement n'y survivrait probablement pas, ni votre navigateur web." ] }, { "cell_type": "code", "execution_count": 63, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "514576" ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from sys import getsizeof\n", "getsizeof(misérables)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Le tableau occupe environ un demi méga-octet de mémoire, ce qui n'est finalement pas si énorme pour un ordinateur moderne." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**But de l'exercice**: Adaptez la fonction ```fréquences_lettres``` de l'exercice précédent pour qu'elle ne fonctionne pas avec un unique tableau, mais plutôt avec un tableau de lignes (en réalité, c'est plutôt la fonction ```occurences``` qui doit être modifiée à cet effet. On pourra par exemple utiliser une nouvelle fonction ```occurences_lignes``` à cet effet)." ] }, { "cell_type": "code", "execution_count": 64, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def occurences_lignes(lignes):\n", " \"\"\"Écrire la documentation de la fonction ici\"\"\"\n", " \n", " pass # Écrire votre code ici" ] }, { "cell_type": "code", "execution_count": 65, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def fréquences_lignes(lignes):\n", " \"\"\"Écrire la documentation de la fonction ici\"\"\"\n", " \n", " pass # Écrire votre code ici" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Et l'inévitable test de validation:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "tags": [ "raises-exception" ] }, "outputs": [], "source": [ "assert fréquences_lignes(misérables) == {\n", " 'a': 0.089, 'b': 0.011, 'c': 0.032, 'd': 0.035,\n", " 'e': 0.172, 'f': 0.011, 'g': 0.009, 'h': 0.01,\n", " 'i': 0.075, 'j': 0.005, 'k': 0.0, 'l': 0.06,\n", " 'm': 0.028, 'n': 0.067, 'o': 0.051, 'p': 0.026,\n", " 'q': 0.012, 'r': 0.064, 's': 0.075, 't': 0.077,\n", " 'u': 0.064, 'v': 0.018, 'w': 0.0, 'x': 0.004,\n", " 'y': 0.003, 'z': 0.002}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "#### Exercice 10: Visualisation des résultats" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "On aimerait représenter graphiquement les résultats de l'exercice précédent. Un diagramme à barres semble parfaitement approprié.\n", "\n", "On utilise pour cela la librarie ```matplotlib```. Voici un exemple:" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "films = [\"Annie Hall\", \"Ben-Hur\", \"Casablanca\", \"Gandhi\", \"West Side Story\"]\n", "nbr_oscars = [5, 11, 3, 8, 19]\n", "\n", "from matplotlib import pyplot as plt\n", "plt.bar(range(len(films)), nbr_oscars)\n", "plt.title(\"Quelques films classiques\")\n", "plt.ylabel(\"Nombre de récompenses\")\n", "plt.xticks(range(len(films)), films)\n", "plt.show()\n", "\n", "# Évaluer DEUX fois cette cellule si le diagramme ne s'affiche pas dans jupyterlab" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**But de l'exercice:** Représenter graphiquement le diagramme des fréquences de lettres dans les *Misérables* de Victor Hugo. Pensez à inclure une légende et un titre adaptés." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.1" }, "toc": { "base_numbering": 1, "nav_menu": {}, "number_sections": false, "sideBar": true, "skip_h1_title": false, "title_cell": "Table of Contents", "title_sidebar": "Contents", "toc_cell": false, "toc_position": {}, "toc_section_display": true, "toc_window_display": false } }, "nbformat": 4, "nbformat_minor": 2 }