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)
En Python, en plus des listes [ ]
, tuples ( )
et dictionnaires { }
, les ensembles sont des listes non ordonnées sans éléments répétés :
set({5, 5, 1, 5, 1})
{1, 5}
set('abracadabra')
{'a', 'b', 'c', 'd', 'r'}
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.
def isogram(mot):
return len(mot) == len(set(mot.lower()))
isogram('Dermatoglyphics')
True
isogram('aba')
False
isogram('moOse')
False
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.
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 :
def isogram(mot):
mot = mot.upper()
for i in range(len(mot)):
for j in range(i+1, len(mot)):
if mot[i] == mot[j]: return False
return True
isogram('Dermatoglyphics')
True
isogram('aba')
False
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.
'abracadabra'.count('a')
5
def isogram(mot):
mot = mot.lower()
return all(mot.count(c) == 1 for c in mot)
isogram('Dermatoglyphics')
True
Ou utiliser le module collections
qui contient la classe Counter
permettant de faire du dénombrement.
from collections import Counter
Counter('abracadabra')
Counter({'a': 5, 'b': 2, 'r': 2, 'c': 1, 'd': 1})
Counter('abracadabra').values()
dict_values([5, 2, 2, 1, 1])
On a alors l'alternative :
from collections import Counter
def isogram(mot):
return all(v == 1 for v in Counter(mot.lower()).values())
isogram('Dermatoglyphics')
True