Mots alphabétiques en Python
Trouvé sur un blog un petit problème simple et marrant : trouver les mots du dictionnaire les plus longs dont les lettres sont dans l’ordre alphabétique, ou dans l’ordre inverse. Cherchez « à la main » et vous n’en trouverez pas tant que ça…
Le problème et les solutions pour l’anglais trouvées avec Mathematica sont ici.
Mon Programme Python pour le français est ci dessous . Il est « non trivial » en raison des accents, car il faut:
- lire correctement les caractères accentués du fichier, encodé en ISO_8859-1
- effectuer le tri en ne tenant pas compte des accents, donc considérer un « é » comme un « e », ce que ne fait pas par défaut la fonction Python… J’ai commencé par écrire une table de correspondance des caractères accentués en non accentués avant de découvrir la fonction magique remove_accents sur le web , qui utilise la très utile librairie unicodedata :
# -*- coding:utf-8 -*- import unicodedata def remove_accents(input_str): nkfd_form = unicodedata.normalize('NFKD', unicode(input_str)) return u"".join([c for c in nkfd_form if not unicodedata.combining(c)]) #http://www.pallier.org/ressources/dicofr/dicofr.html with open('liste.de.mots.francais.frgut.txt','r') as f: for line in f: line=line.rstrip() line=unicode(line,'ISO-8859-1') s=remove_accents(line) if len(s)>5 and s==''.join(sorted(s)): print '>',line if len(s)>5 and s==''.join(sorted(s,reverse=True)): print '<',line
Le programme produit cette liste de résultats, avec en gras les mots de 7 lettres (les autres en ont 6) et en lien les mots que je ne connaissais pas:
> accent
> accort
> affins
> afflux
> bijoux
> billot
> chintz
> dehors
> effort
< piffée
< poliça
< pongée
< rongea
< rongée
< sniffa
< sniffe
< sniffé
< sniffée
< sommée
< songea
< sonnée
< spolia
< spolie
< spolié
< spoliée
< volige
< voligé
< voligea
< voligée
< yttria
La guerre des accents est sans fin… Entre le HTML et ses espèeluette+ code de caractère, l’UTF-8 (celui que je préfère), le « vieux » codage 437 originale de l’IBM-PC, toujours en vigueur dans une console de commande, l’ISO-8859-1 et l’unicode (standard Python), il y a de quoi faire et s’arracher le cheveux.
Remarquablement court, ton programme!