{ "cells": [ { "cell_type": "markdown", "id": "1083a244", "metadata": {}, "source": [ "# Dixième exercice en Python (Niveau Lycée)" ] }, { "cell_type": "markdown", "id": "6b34b83b", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "id": "88d56210", "metadata": {}, "source": [ "*Résumé en français* : On vous donne une liste contenant des **couleurs** de **moufles** (donc pas de main gauche ou droite à distinguer). On vous demande le **nombre de paires** que vous pouvez **constituer**, c'est-à-dire avoir **2 moufles de la même couleur**. " ] }, { "cell_type": "markdown", "id": "f54ad165", "metadata": {}, "source": [ "Avec le **premier exemple** donné, on peut constituer une **paire** de moufles **rouge** (red) **et** une paire **bleue** (blue) soit **2 paires**." ] }, { "cell_type": "markdown", "id": "248a940e", "metadata": {}, "source": [ "## Version classique" ] }, { "cell_type": "markdown", "id": "b44fedd4", "metadata": {}, "source": [ "Relisez l'exercice 6 que j'ai proposé, vous devriez constater de nombreuses ressemblances.\n", "\n", "Une **première idée** est de commencer par **récupérer les différentes** couleurs puis, **pour chacune d'elle**, de compter **combien de fois** cette **couleur apparait**. Il suffira de **diviser par 2** ce nombre (sans tenir compte des virgules) pour savoir **combien de paires** on peut **constituer** avec cette couleur. Finalement, on fera la **somme** du **nombre de paires** trouvées." ] }, { "cell_type": "markdown", "id": "d6fdeecc", "metadata": {}, "source": [ "Je reprends la **structure classique** vue dans l'exercice 6 :" ] }, { "cell_type": "code", "execution_count": 1, "id": "6c626080", "metadata": {}, "outputs": [], "source": [ "def nb_paires(gants):\n", " couleurs = [ ] # couleurs distinctes\n", " for g in gants: # on parcourt les gants\n", " if g not in couleurs: # nouvelle couleur ?\n", " couleurs.append(g) # on l'ajoute à la liste\n", " paires = 0 # nombre de paires possibles\n", " for c in couleurs: # on parcourt à nouveau les gants\n", " paires += gants.count(c) // 2 # on compte puis ÷ entière par 2 \n", " return paires # on renvoie le nombre de paires" ] }, { "cell_type": "code", "execution_count": 2, "id": "8f57e2e6", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nb_paires([\"gray\",\"black\",\"purple\",\"purple\",\"gray\",\"black\"])" ] }, { "cell_type": "code", "execution_count": 3, "id": "a31135c9", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nb_paires([\"red\",\"green\",\"blue\"])" ] }, { "cell_type": "markdown", "id": "d5035601", "metadata": {}, "source": [ "## Version ensembliste" ] }, { "cell_type": "markdown", "id": "e9375d3e", "metadata": {}, "source": [ "Comme nous l'avons également vu dans l'exercice 6, nous pouvons utiliser des **ensembles** (`set`) pour récupérer les éléments **uniques**. Les versions sont alors nettement plus courtes :" ] }, { "cell_type": "code", "execution_count": 4, "id": "6d432895", "metadata": {}, "outputs": [], "source": [ "def nb_paires(gants):\n", " return sum(gants.count(v) // 2 for v in set(gants))" ] }, { "cell_type": "code", "execution_count": 5, "id": "3c04efc7", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nb_paires([\"gray\",\"black\",\"purple\",\"purple\",\"gray\",\"black\"])" ] }, { "cell_type": "markdown", "id": "90fd0000", "metadata": {}, "source": [ "## Version utilisant une seule boucle et une pile" ] }, { "cell_type": "markdown", "id": "d38d2080", "metadata": {}, "source": [ "Est-il vraiment nécessaire de récupérer les couleurs uniques ? Imaginons la situation dans la **vie réelle** avec `'red' 'green' 'red' 'blue' 'blue'` :\n", "\n", "- Dans ma tête je pense à **0**, c'est le **nombre de paires** que j'ai réussi à faire\n", "- Je prends le **premier** gant, il est `'red'`, je n'ai pas cette couleur donc je la garde\n", "- Je prends le **deuxième**, il est `'green'`, je n'ai pas cette couleur donc je la garde\n", "- Je prends le **troisième**, il est `'red'`. J'ai déjà cette couleur, je peux donc faire une **paire**. **J'enlève** les 2 moufles 'red' et **j'ajoute 1** au nombre de paires\n", "- Je prends le **quatrième**, il est `'blue'`, je n'ai pas cette couleur donc je la garde\n", "- Je prends le **cinquième**, il est `'blue'`. J'ai déjà cette couleur, je peux donc faire une **paire**. J'enlève les 2 moufles 'blue' et **j'ajoute 1** au nombre de paires\n", "- J'ai finalement réussi à constituer **2 paires**." ] }, { "cell_type": "markdown", "id": "5853d19b", "metadata": {}, "source": [ "🤖 Refaites de tête le processus avec les gants `'red' 'red' 'red' 'red' 'red'`" ] }, { "cell_type": "markdown", "id": "b44eeb17", "metadata": {}, "source": [ "**Prendre** un gant revient à **ajouter** un élément dans une liste, inversement **créer** une **paire** à **éliminer** cette couleur de la liste. Voyons comment ajouter, enlever ou tester si un élément est dans un ensemble en utilisant les méthodes `add`, `remove` :" ] }, { "cell_type": "code", "execution_count": 7, "id": "4968c2b2", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'red'}" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "paires = set() # Ensemble vide\n", "paires.add('red') # on ajoute 'red' à l'ensemble\n", "paires" ] }, { "cell_type": "code", "execution_count": 8, "id": "fea5c34d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'blue', 'red'}" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "paires.add('blue')\n", "paires" ] }, { "cell_type": "code", "execution_count": 9, "id": "1c2c463c", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'blue'}" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "paires.remove('red') # on enlève 'red'\n", "paires" ] }, { "cell_type": "code", "execution_count": 10, "id": "117b34e2", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "'red' in paires # on teste si 'red' est dans l'ensemble" ] }, { "cell_type": "markdown", "id": "74d805f4", "metadata": {}, "source": [ "Version finale basée sur cette idée :" ] }, { "cell_type": "code", "execution_count": 11, "id": "0df6090d", "metadata": {}, "outputs": [], "source": [ "def nb_paires(gants):\n", " couleurs = set() # les couleurs trouvées\n", " paires = 0 # nb de paires réalisées\n", " for c in gants: # on parcourt les gants\n", " if c in couleurs: # couleur déjà vue ?\n", " couleurs.remove(c) # on la retire des couleurs trouvées\n", " paires += 1 # le nombre de paires augmente de 1\n", " else: # sinon\n", " couleurs.add(c) # ajouter cette nouvelle couleur\n", " return paires # nombre de paires trouvées" ] }, { "cell_type": "code", "execution_count": 12, "id": "babfacab", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "nb_paires([\"gray\",\"black\",\"purple\",\"purple\",\"gray\",\"black\"])" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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.9.6" } }, "nbformat": 4, "nbformat_minor": 5 }