{
"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"
}
}
}