{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Listes et Dictionnaires\n", "\n", "Ludovic Deneuville\n", "\n", "## Avant de commencer\n", "\n", "- Téléchargez ce\n", " notebook\n", " Jupyter\n", "- Connectez-vous au\n", " Jupyter\n", " ENSAI avec id et mot de passe\n", " - ou une autre plate-forme (SSPCloud, Jupyter Lab, Google Colab,\n", " Kaggle…)\n", "- Importez le fichier .ipynb\n", "\n", "## 1 Conteneurs\n", "\n", "Il existe plusieurs structures de données en Python :\n", "\n", "- Listes (list) : collection ordonnée et modifiable d’éléments\n", "- Dictionnaires (dict) : collection non ordonnée de paires\n", " **clé-valeur**\n", "- Ensembles (set) : collection non ordonnée d’éléments **uniques**\n", "- Tuples (tuple) : collection ordonnée et immuable d’éléments\n", "\n", "Nous allons ici nous concentrer sur les deux structures les plus\n", "courantes : les **listes** et les **dictionnaires**\n", "\n", "## 2 Listes\n", "\n", "Propriétés des listes Python :\n", "\n", "- **Indexation** : Les éléments d’une liste sont indexés, ce qui\n", " signifie qu’ils peuvent être accédés en utilisant leur position dans\n", " la liste. L’index du premier élément est 0, et l’index du dernier\n", " élément est len(liste) - 1.\n", "- **Mutable** : Les listes sont des objets mutables, ce qui signifie\n", " que vous pouvez modifier leurs éléments. Vous pouvez ajouter,\n", " supprimer ou modifier des éléments.\n", "- **Hétérogénéité** : Les listes peuvent contenir des éléments de\n", " différents types de données : entiers, chaînes de caractères,\n", " booléens, voire d’autres listes.\n", "- **Longueur variable** : Les listes peuvent contenir un nombre\n", " variable d’éléments. Elles peuvent être vides (sans éléments) ou\n", " contenir un nombre illimité d’éléments.\n", "\n", "### 2.1 Créer une liste" ], "id": "1688e9fc-42f2-4dbc-9fd0-b045e070df02" }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# Liste d'entiers\n", "a = [22, 29, 35, 56]\n", "a" ], "id": "8694c925" }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "type(a)" ], "id": "00e7778f" }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# Liste mixte\n", "b = [\"bonjour\", 20, True]\n", "print(b)" ], "id": "12c06bd2" }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# Concaténation\n", "a + b" ], "id": "6e6ac45e" }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "# Répétition\n", "a * 2" ], "id": "1b82dc41" }, { "cell_type": "markdown", "metadata": {}, "source": [ "Il existe de nombreuses autres possibilités pour créer des listes." ], "id": "6b4d34db-645f-4386-8552-b8565d054fcc" }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "list(range(1, 7))" ], "id": "d581001c" }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "[x for x in range(1, 7)]" ], "id": "8fa829b7" }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "# En séparant une chaîne de caractères\n", "c = \"bleu;blanc;rouge;vert;jaune\"\n", "c.split(\";\")" ], "id": "0d8570f5" }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.2 Méthodes utiles" ], "id": "9627bd4e-6586-4237-a6da-43f6ffd37d74" }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "# Nombre d'éléments\n", "len(a)" ], "id": "a685785f" }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "# Premier élément\n", "a[0]" ], "id": "2d2df23f" }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "# Dernier élément\n", "a[-1]" ], "id": "3e4818c9" }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "# Tous les éléments à partir de la position 1\n", "a[1:]" ], "id": "343515a1" }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "# Tester si une valeur appartient à une liste\n", "22 in a" ], "id": "1a602b4b" }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "# Trouver la position d'un élément\n", "a.index(29)" ], "id": "c6bc6f34" }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "# Inverser une liste (sans modifier la liste d'origine)\n", "print(\"a[::-1] : \" + str(a[::-1]))\n", "print(\"a : \" + str(a))" ], "id": "fd19df8c" }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "# Inverser une liste (ici l'inversion est sauvegardée dans la variable **a** )\n", "a.reverse()\n", "a" ], "id": "e74b1933" }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "# Trier une liste (sans modifier la liste d'origine)\n", "sorted(a)" ], "id": "e98396a5" }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "# Order décroissant\n", "sorted(a, reverse=True)" ], "id": "0a99aae2" }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "# Trier une liste (en sauvegardant la modification dans la variable **a**)\n", "print(\"Avant : \" + str(a))\n", "a.sort()\n", "print(\"Après : \" + str(a))" ], "id": "dbe0ad4b" }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.3 Ajouter, modifier et supprimer" ], "id": "72b0660e-6fbf-47c9-8bc5-c6c0a6710371" }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [], "source": [ "# Ajouter à la fin\n", "a.append(44)\n", "a" ], "id": "dea9c844" }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "# Insérer à une position précise\n", "a.insert(2, 88)\n", "a" ], "id": "b95be279" }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "# Modifier\n", "a[0] = 99\n", "a" ], "id": "01d4bbb5" }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "# Supprimer par position\n", "a.pop(3)\n", "a" ], "id": "1d853ae4" }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "# Supprimer par valeur\n", "a.remove(44)\n", "a" ], "id": "bba811c0" }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 2.4 Copier une liste\n", "\n", "Observez, puis exécutez le code ci-dessous, il contient les instructions\n", "suivantes :\n", "\n", "- création de la variable **liste**\n", "- création de la variable **copie**\n", "- suppression du dernier élément de **copie**\n", "- affichage de **liste**" ], "id": "4c18cf32-e9d9-4bd3-bede-7133a341f13b" }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "liste = [1, 2, 3, 4]\n", "liste2 = liste\n", "liste2.pop()\n", "liste" ], "id": "3e87761c" }, { "cell_type": "markdown", "metadata": {}, "source": [ "Nous pourrions nous attendre à ce que la variable **liste** ne soit pas\n", "modifiée et affiche `[1, 2, 3, 4]`. \n", "Pourtant la variable **liste2** n’est pas une copie de **liste**, c’est\n", "simplement une autre manière d’appeler la même liste." ], "id": "e24b80bb-55df-438a-9af3-5303bc624301" }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "# Pour créer une vraie copie qui sera distinct de l'original\n", "copie = list(liste)\n", "copie.append(9)\n", "liste, copie" ], "id": "bdea11d3" }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [], "source": [ "# Autre possibilité pour copier\n", "cp = liste.copy()\n", "cp.append(8)\n", "liste, cp" ], "id": "75d781c0" }, { "cell_type": "markdown", "metadata": {}, "source": [ "------------------------------------------------------------------------\n", "\n", "## 3 Dictionnaires\n", "\n", "Propriétés importantes d’un dictionnaire en Python :\n", "\n", "- **Indexation par clé** : Les éléments d’un dictionnaire sont indexés\n", " par des clés plutôt que par des positions. **Chaque clé doit être\n", " unique** dans le dictionnaire, et elle est associée à une valeur\n", " correspondante. La recherche d’une valeur associée à une clé est\n", " très rapide.\n", "- **Mutable** : Les dictionnaires sont des objets mutables, ce qui\n", " signifie que vous pouvez ajouter, supprimer ou modifier des éléments\n", " du dictionnaire après sa création.\n", "- **Hétérogénéité** : Les dictionnaires peuvent contenir des paires\n", " clé-valeur avec des types de données différents. Les clés peuvent\n", " être de types immuables tels que les chaînes de caractères, les\n", " entiers… Les valeurs peuvent être de n’importe quel type de données\n", " valide en Python.\n", "- **Longueur variable** : Les dictionnaires peuvent contenir un nombre\n", " variable de paires clé-valeur. Ils peuvent être vides (sans paires\n", " clé-valeur) ou contenir un nombre illimité de paires.\n", "- **Non ordonné** : Contrairement aux listes, les éléments d’un\n", " dictionnaire n’ont pas d’ordre défini. L’ordre dans lequel les\n", " paires clé-valeur sont stockées n’est pas garanti et peut changer\n", " lors des opérations de modification du dictionnaire.\n", "\n", "### 3.1 Créer un dictionnaire" ], "id": "ae2f21a5-5341-415e-a990-8e6d0d2bc05b" }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "ingredients = {'sucre': '100g', 'poire': 2, 'lait': '1L', 'sel': True}\n", "ingredients" ], "id": "9c7fa665" }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [], "source": [ "type(ingredients)" ], "id": "896e32d9" }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "# Nombre d'éléments\n", "len(ingredients)" ], "id": "295bb740" }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [], "source": [ "# Recherche par clé\n", "ingredients['lait']" ], "id": "f12a9bfe" }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "# Recherche par clé - autre possibilité\n", "ingredients.get('lait')" ], "id": "fd14d1e4" }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.2 Ajouter, modifier et supprimer" ], "id": "002ac444-9d7c-4c5b-a85c-3699a0bace0f" }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [], "source": [ "# Ajouter un élément\n", "ingredients['fraise'] = '200g'\n", "ingredients" ], "id": "3febedc5" }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [], "source": [ "# Modifier\n", "ingredients['sucre'] = '35g'\n", "ingredients" ], "id": "fb1e05c9" }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [], "source": [ "# Supprimer \n", "ingredients.pop('lait')\n", "ingredients" ], "id": "9922aa5d" }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 3.3 Méthodes utiles" ], "id": "c44683ce-e903-42eb-aa8a-143605251c41" }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [], "source": [ "# Liste des clés\n", "list(ingredients.keys()) # idem : list(ingredients)" ], "id": "697ddb8f" }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [], "source": [ "# Liste des valeurs\n", "list(ingredients.values())" ], "id": "a784d8e3" }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [], "source": [ "# Liste des items (liste de tuples)\n", "list(ingredients.items())" ], "id": "25e55e75" }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4 Les types « vide »\n", "\n", "Maintenant que nous avons vu les listes et les dictionnaires, nous\n", "pouvons parler des types **vides**. \n", "Par exemple, il est possible de créer :\n", "\n", "- une variable qui ne contient rien : `None`\n", "- une liste vide `[]`\n", "- un dictionnaire vide `{}`" ], "id": "ed49e73b-05a9-46d9-9633-98c886c485d7" }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [], "source": [ "x = None\n", "type(x)" ], "id": "eb451c53" }, { "cell_type": "code", "execution_count": 40, "metadata": {}, "outputs": [], "source": [ "y = []\n", "type(y)" ], "id": "f79d6653" }, { "cell_type": "code", "execution_count": 41, "metadata": {}, "outputs": [], "source": [ "z = {}\n", "type(z)" ], "id": "c38e3179" }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 5 Exercices\n", "\n", "### 5.1 Exercice 1\n", "\n", "En partant de la liste\n", "`notes = [\"do\", \"re\", \"re\", \"re\", \"fa\", \"sol\", \"solsi\", \"la\"]`,\n", "**ajoutez, supprimez et modifiez** des éléments pour qu’elle contienne\n", "les notes de musique “do re mi fa sol la si” dans le bon ordre." ], "id": "dfd155a9-7549-4b68-8076-9d96ad828701" }, { "cell_type": "code", "execution_count": 42, "metadata": {}, "outputs": [], "source": [ "# Testez votre réponse dans cette cellule" ], "id": "2a1c5e42" }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.2 Exercice 2\n", "\n", "Proposez deux méthodes pour inverser la liste\n", "`[\"un\", \"deux\", \"trois\", \"quatre\"]`. Quelle est la différence majeure\n", "entre les deux méthodes ?" ], "id": "3e6da811-7898-4a97-9a4c-47dbb8977906" }, { "cell_type": "code", "execution_count": 43, "metadata": {}, "outputs": [], "source": [ "# Testez votre réponse dans cette cellule" ], "id": "ed6fd841" }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.3 Exercice 3\n", "\n", "Testez le comportement de la méthode **pop** sur la liste des entiers de\n", "1 à 9. \n", "Par exemple, testez **pop()** sans paramètres ou encore **pop(-1)**." ], "id": "001c1820-3f5e-4b89-9a55-ee1b881e7223" }, { "cell_type": "code", "execution_count": 44, "metadata": {}, "outputs": [], "source": [ "# Testez votre réponse dans cette cellule" ], "id": "a04f2336" }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.4 Exercice 4\n", "\n", "Testez le comportement des méthodes **min** et **max** sur :\n", "\n", "- sur une liste composée uniquement d’objets numériques (`int` et\n", " `float`) ;\n", "- sur une liste composée uniquement de chaînes de caractères ;\n", "- sur une liste composée d’un mélange d’objets numériques et textuels." ], "id": "edbf20f7-4b3b-4729-b57b-7953a56f7908" }, { "cell_type": "code", "execution_count": 45, "metadata": {}, "outputs": [], "source": [ "# Testez votre réponse dans cette cellule" ], "id": "63ea4d34" }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.5 Exercice 5\n", "\n", "Essayer de créer une liste vide puis vérifiez son type. \n", "Quel intérêt cela pourrait-il avoir ?" ], "id": "a4a3b69f-9214-4a9c-8866-3ebff135c953" }, { "cell_type": "code", "execution_count": 46, "metadata": {}, "outputs": [], "source": [ "# Testez votre réponse dans cette cellule" ], "id": "3cd2b414" }, { "cell_type": "markdown", "metadata": {}, "source": [ "Exercice Soit le dictionnaire suivant :\n", "`animaux = {'chats': 5, 'chiens': 12}`\n", "\n", "Que vont retourner les tests d’appartenance suivants ? Vérifiez vos\n", "prédictions.\n", "\n", "- `'chats' in animaux.keys()`\n", "- `'chats' in animaux.values()`\n", "- `'chats' in animaux`" ], "id": "bb5b9c62-f737-454c-a8ca-e1900dd46c34" }, { "cell_type": "code", "execution_count": 47, "metadata": {}, "outputs": [], "source": [ "# Testez votre réponse dans cette cellule" ], "id": "d8d9cdb6" }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.6 Exercice 6\n", "\n", "Soit le dictionnaire défini dans la cellule ci-dessous. \n", "Affichez à l’aide d’opérations print :\n", "\n", "- la liste des noms des différentes classes\n", "- la note de Miranda en histoire\n", "- la liste des notes obtenues par Hypolyte\n", "- la liste des noms des élèves de la 6emeB\n", "- la liste des matières enseignées en 6eme A\n", "- la liste de toutes les matières enseignées\n", "- la liste des notes obtenues par les filles des deux classes" ], "id": "bf994677-6e8b-4712-ac79-91d73d7622ec" }, { "cell_type": "code", "execution_count": 48, "metadata": {}, "outputs": [], "source": [ "resultats = {\n", " \"6emeA\": {\"Miranda\" : {\"notes\": {\"physique\": 16, \"histoire\": 12}},\n", " \"Celestin\": {\"notes\": {\"physique\": \"absent\", \"histoire\": 18}}\n", " },\n", " \"6emeB\": {\"Hypolyte\": {\"notes\": {\"maths\": 11, \"anglais\": 0}},\n", " \"Josephine\": {\"notes\": {\"maths\": 16, \"anglais\": 20}}\n", " }\n", "}" ], "id": "1b8ff3d6" }, { "cell_type": "code", "execution_count": 49, "metadata": {}, "outputs": [], "source": [ "# Testez votre réponse dans cette cellule" ], "id": "4e8c1644" }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.7 Exercice 7\n", "\n", "À l’aide d’un dictionnaire, comptez puis affichez le nombre d’occurences\n", "de chaque caractère dans la phrase suivante :\n", "\n", "- `Je compte le nombre d'occurences de chaque caractère de la phrase courante.`\n", "\n", "**Astuce** : au préalable, faites un test sur une chaine plus petite." ], "id": "2387fe0f-bf31-4cfb-afd6-7bf5f5df28d7" }, { "cell_type": "code", "execution_count": 50, "metadata": {}, "outputs": [], "source": [ "# Testez votre réponse dans cette cellule" ], "id": "04783da1" }, { "cell_type": "markdown", "metadata": {}, "source": [ "### 5.8 Exercice 8\n", "\n", "Nettoyer cette liste pour retirer tous les doublons et ne conserver\n", "qu’une seule occurence de chaque fruit :\n", "\n", "- `fruits = ['pomme', 'banane', 'orange', 'fraise', 'citron', 'fraise', 'banane', 'orange', 'banane', 'pomme', 'fraise']`\n", "\n", "**Indice** : utiliser les set" ], "id": "1f42d655-1b0d-40e1-a0e4-b23f09c196a6" }, { "cell_type": "code", "execution_count": 51, "metadata": {}, "outputs": [], "source": [ "# Testez votre réponse dans cette cellule" ], "id": "9ee2f04b" } ], "nbformat": 4, "nbformat_minor": 5, "metadata": { "kernelspec": { "name": "python3", "display_name": "Python 3 (ipykernel)", "language": "python", "path": "/opt/hostedtoolcache/Python/3.10.14/x64/share/jupyter/kernels/python3" }, "language_info": { "name": "python", "codemirror_mode": { "name": "ipython", "version": "3" }, "file_extension": ".py", "mimetype": "text/x-python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.14" } } }