{ "cells": [ { "cell_type": "markdown", "id": "2167c041", "metadata": {}, "source": [ "# Troisième exercice Python (Niveau Lycée)" ] }, { "cell_type": "markdown", "id": "bf9936e9", "metadata": {}, "source": [ "" ] }, { "cell_type": "markdown", "id": "28f4e6cc", "metadata": {}, "source": [ "*Résumé en français* : un **isogram** (En français on parle d'**heterogramme**) est un mot qui ne contient aucune lettre répétée. Ecrire une fonction qui renvoie **vrai** ou **faux** suivant que le mot est un heterogramme, sans tenir compte de la casse (majuscule/minuscule)" ] }, { "cell_type": "markdown", "id": "581b18f6", "metadata": {}, "source": [ "## Les ensembles" ] }, { "cell_type": "markdown", "id": "3bacce01", "metadata": {}, "source": [ "En Python, en plus des listes `[ ]`, tuples `( )` et dictionnaires `{ }`, les ensembles sont des listes non ordonnées sans éléments répétés :" ] }, { "cell_type": "code", "execution_count": 1, "id": "96eebc27", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{1, 5}" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "set({5, 5, 1, 5, 1})" ] }, { "cell_type": "code", "execution_count": 2, "id": "19c6ec7a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'a', 'b', 'c', 'd', 'r'}" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "set('abracadabra')" ] }, { "cell_type": "markdown", "id": "c8e56dac", "metadata": {}, "source": [ "*L'idée principale* : On aura un heterogramme si la taille de l'ensemble des lettres utilisées pour écrire le mot est égal à la taille du mot initial. " ] }, { "cell_type": "code", "execution_count": 3, "id": "1b6e76f5", "metadata": {}, "outputs": [], "source": [ "def isogram(mot):\n", " return len(mot) == len(set(mot.lower()))" ] }, { "cell_type": "code", "execution_count": 4, "id": "3a4e580a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "isogram('Dermatoglyphics')" ] }, { "cell_type": "code", "execution_count": 5, "id": "59601c48", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "isogram('aba')" ] }, { "cell_type": "code", "execution_count": 6, "id": "8a870e76", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "isogram('moOse')" ] }, { "cell_type": "markdown", "id": "9ce02163", "metadata": {}, "source": [ "Remarquez que le mot a besoin d'être mis en minuscule (ou majuscule) uniquement pour créer l'ensemble des lettres, pas pour trouver sa taille initiale. `len` permet en Python de donner la taille d'une chaine, d'une liste ou d'un dictionnaire." ] }, { "cell_type": "markdown", "id": "2fb75793", "metadata": {}, "source": [ "## Recherche d'au moins une lettre en double" ] }, { "cell_type": "markdown", "id": "3d495a46", "metadata": {}, "source": [ "Une autre idée peut être de rechercher s'il existe au moins une lettre en double, par exemple en utilisant 2 boucles, en voici une version :" ] }, { "cell_type": "code", "execution_count": 7, "id": "8a4ff2a6", "metadata": {}, "outputs": [], "source": [ "def isogram(mot):\n", " mot = mot.upper()\n", " for i in range(len(mot)):\n", " for j in range(i+1, len(mot)):\n", " if mot[i] == mot[j]: return False\n", " return True" ] }, { "cell_type": "code", "execution_count": 8, "id": "b0e0c35b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "isogram('Dermatoglyphics')" ] }, { "cell_type": "code", "execution_count": 9, "id": "91414da7", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "False" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "isogram('aba')" ] }, { "cell_type": "markdown", "id": "5f75f965", "metadata": {}, "source": [ "## D'autres pistes..." ] }, { "cell_type": "markdown", "id": "07b64b26", "metadata": {}, "source": [ "Pour savoir si une lettre est en double, on peut compter (`count`) combien de fois elle apparait dans le mot. Si toutes (`all`) les lettres n'apparaissent qu'une seule fois, c'est un heterogramme." ] }, { "cell_type": "code", "execution_count": 10, "id": "04257b94", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "5" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "'abracadabra'.count('a')" ] }, { "cell_type": "code", "execution_count": 13, "id": "d12f38c7", "metadata": {}, "outputs": [], "source": [ "def isogram(mot):\n", " mot = mot.lower()\n", " return all(mot.count(c) == 1 for c in mot)" ] }, { "cell_type": "code", "execution_count": 14, "id": "22660260", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "isogram('Dermatoglyphics')" ] }, { "cell_type": "markdown", "id": "cd73ed57", "metadata": {}, "source": [ "Ou utiliser le module `collections` qui contient la classe `Counter` permettant de faire du dénombrement." ] }, { "cell_type": "code", "execution_count": 15, "id": "879e55ff", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1})" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from collections import Counter\n", "Counter('abracadabra')" ] }, { "cell_type": "code", "execution_count": 16, "id": "7baeb17d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "dict_values([5, 2, 2, 1, 1])" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Counter('abracadabra').values()" ] }, { "cell_type": "markdown", "id": "6b94b55e", "metadata": {}, "source": [ "On a alors l'alternative :" ] }, { "cell_type": "code", "execution_count": 17, "id": "f0ea8c7e", "metadata": {}, "outputs": [], "source": [ "from collections import Counter\n", "\n", "def isogram(mot): \n", " return all(v == 1 for v in Counter(mot.lower()).values())" ] }, { "cell_type": "code", "execution_count": 18, "id": "0e58c81b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "isogram('Dermatoglyphics')" ] } ], "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 }