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  :
# -*- 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

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

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.