Microclub

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:

  1. lire correctement les caractères accentués du fichier, encodé en ISO_8859-1
  2. 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  :

[code lang= »Python »]
# -*- 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
[/code]

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

Une réflexion sur “Mots alphabétiques en Python

  • 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!

Laisser un commentaire