IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Trier du Unicode?


Sujet :

Python

  1. #1
    Membre émérite
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Par défaut Trier du Unicode?
    J'ai une liste contenant des objets unicode que je voudrais trier en ordre alphabétique. Pour les caractères non-accentués, il n'y a pas de problèmes, par contre les noms avec des accents causent problème. Dans l'exemple suivante, l'ordre devrait être Adam, Éric, Jocelyn, Vincent, mais Éric se retrouve en dernier à cause (j'imagine) du code point du 'É' qui est plus grand que celui du 'V'.

    Quelqu'un sait comment trier "naturellement"?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    >>> noms = [u'Jocelyn', u'Vincent', u'Éric', u'Adam']
    >>> noms
    [u'Jocelyn', u'Vincent', u'\xc9ric', u'Adam']
    >>> sorted(noms)
    [u'Adam', u'Jocelyn', u'Vincent', u'\xc9ric']
    >>>

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 93
    Par défaut
    Ca devrai aider :
    http://groups.google.com/group/comp....0eae7cd85f6119

    Edit : en fait non, c'est juste pour trier les nombres...

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    93
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 93
    Par défaut
    Une petite piste très barbare :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    def poids(car):
        #retourne une estimation du poids du caractere
        #les caracteres accentues comptent comme des lettres normales
        poids = ord(car)
        if poids in [131, 132, 133, 134, 160]:
            poids = ord('a')
        elif poids in [130, 136, 137, 138]:
            poids = ord('e')
        elif poids in [139, 140, 141, 161]:
            poids = ord('i')
        elif poids in [147, 148, 149, 162]:
            poids = ord('o')
        elif poids in [129, 150, 151, 163]:
            poids = ord('u')
        return poids
     
    def compare(nom1, nom2):
        #retourne Vrai si nom2 doit etre place avant nom1
        if len(nom1) > len(nom2):
            max = len(nom2)
        else:
            max = len(nom1)
        poids1 = poids2 = 0
        for i in range(max):
            poids1 += poids(nom1[i])
            poids2 += poids(nom2[i])
        return poids2 < poids1
     
    def trier(noms):
        #trie les noms de facon naturelle (retourne une nouvelle liste)
        liste = noms[:]
        nbNoms = len(liste)
        fini = False
        while not fini:
            fini = True
            for i in range(1, nbNoms):
                if compare(liste[i-1], liste[i]):
                    liste[i], liste[i-1] = liste[i-1], liste[i]
                    fini = False
        return liste
    A perfectionner !

    'trier' soumet la liste de noms à un simple tri bulle,
    'compare'... compare... deux noms pour savoir si le second vient avant le premier,
    'poids' estime le poids d'un caractère : c'est là que tout se joue, puisqu'on y estime qu'un caractère accentué a le même poids qu'une lettre normale. Je n'ai pas pris en compte tous les caractères accentués (notamment les majuscules), je te laisse le soin de revérifier et compléter les codes ascii (sauf si tu trouves une meilleure solution !).

Discussions similaires

  1. conversion Unicode -> ASCII
    Par juzam dans le forum C
    Réponses: 8
    Dernier message: 24/07/2003, 10h07
  2. trier les données dans le cache ??
    Par psyco2604 dans le forum XSL/XSLT/XPATH
    Réponses: 31
    Dernier message: 10/06/2003, 10h03
  3. [debutant] unicode
    Par dadou91 dans le forum XML/XSL et SOAP
    Réponses: 7
    Dernier message: 23/05/2003, 10h12
  4. Créer une vue pour trier une requete UNION ?
    Par Etienne Bar dans le forum SQL
    Réponses: 3
    Dernier message: 03/01/2003, 20h22
  5. trier un tableau et compter des elements du tableau
    Par remi51 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 17/06/2002, 16h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo