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 :

[string] Trier alphabetiquement des string avec des caracteres speciaux


Sujet :

Python

  1. #1
    Membre habitué Avatar de KINENVEU
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 184
    Points : 131
    Points
    131
    Par défaut [string] Trier alphabetiquement des string avec des caracteres speciaux
    bonjour,

    j'aimerai donc trier par ordre alphabetique des string avec des caracteres speciaux.
    du type :
    "œil", "Æ", "être", "île", "éveil", ...

    Quand je lance un "sort" brut, je n'ai pas le resultat voulu.
    (a savoir par exemple: "île" entre "hibou" et "jardin")

    j'ai essaye avec le key=str.lower(), ca me regle le probleme des capitales.
    Je n'ai pas trouve de fonction qui me transforme les caracteres speciaux en un equivalent dans [a-z].
    (par exemple: f("œil") produit "oeil", f("île") produit "ile", ...)

    quelqu'un aurait-il une idee ?

    merci par avance.

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Salut

    Tu définis ta fonction de comparaison telle que tu la veux. Elle doit
    - recevoir 2 éléments à comparer
    - renvoyer -1; 0 ou 1 selon que l'élément 1 est plus petit (selon ta propre conception de "plus petit"), égal ou plus grand que l'élément 2

    Exemple
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    def compar(x, y):
        ... tout un code qui va gérer Æ avec le reste pour finalement
        ... renvoyer -1 ou 0 ou 1

    Ensuite, te suffit d'invoquer tableau.sort(fct) si tu veux trier ton tableau (il sera donc modifié) ou bien sorted(tableau, fct) si tu veux que le tri se fasse à la volée. Et tu peux éventuellement rajouter "reverse=True" si tu veux inverser le tri...

    Exemple
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tab=["œil", "Æ", "être", "île", "éveil"]
    b=sorted(tab, compar, reverse=True)
    print b
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre habitué Avatar de KINENVEU
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 184
    Points : 131
    Points
    131
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Salut

    Tu définis ta fonction de comparaison telle que tu la veux. Elle doit
    - recevoir 2 éléments à comparer
    - renvoyer -1; 0 ou 1 selon que l'élément 1 est plus petit (selon ta propre conception de "plus petit"), égal ou plus grand que l'élément 2
    merci.
    Mais avec cette approche,
    je vais devoir coder toutes les conversions de carateres speciaux a la main quand meme.
    Et c'est exactement ce que je voudrais eviter.

  4. #4
    Membre éprouvé

    Homme Profil pro
    Diverses et multiples
    Inscrit en
    Mai 2008
    Messages
    662
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Diverses et multiples

    Informations forums :
    Inscription : Mai 2008
    Messages : 662
    Points : 1 273
    Points
    1 273
    Par défaut
    Malheureusement, il semble ne pas y avoir de solution miracle (je trouve d’ailleurs que ça manque…). Donc, je crains qu’il ne te faille coder tes “transcriptions” à la main… Perso, je ferais comme ça*:

    * Créer une table de conversion (c’est la partie la plus pénible, python pourrait en fournir une…).
    * Trier en utilisant translate en plus de lower.

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> trans = str.maketrans({"œ":"oe", "æ":"ae", "é":"e", "è":"e","ê":"e"}) #etc.
    >>> l = ["dummy", "alors", "œuf", "advanced", "ætéria", "être", "étirer"]
    >>> l.sort(key=lambda k: k.lower().translate(trans))
    >>> l
    ['advanced', 'ætéria', 'alors', 'dummy', 'étirer', 'être', 'œuf']

  5. #5
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    S'il faut faire un tri selon le dictionnaire français, il existe une solution toute faite déjà intégrée à Python et qui ne marche pas mal.

    Pour vérifier si elle marche dans tous les cas, j'ai vérifié avec cet excellent article http://www-clips.imag.fr/geta/gilles...-francais.html.

    J'ai fait quelques compléments, et j'ai fini par adopter le code suivant qui marche dans tous les cas que j'ai essayés:

    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
    import locale
     
    class Compfr(object):
     
        def __init__(self, decod='utf-8'):
            self.decod = decod
            locale.setlocale(locale.LC_ALL, '')
            self.espinsec = u'\xA0' # espace insécable
     
        def __call__(self, v1, v2):
     
            # on convertit en unicode si nécessaire
            if isinstance(v1, str):
                v1 = v1.decode(self.decod)
            if isinstance(v2, str):
                v2 = v2.decode(self.decod)
     
            # on retire les tirets et les blancs insécables
            v1 = v1.replace(u'-', u'')
            v1 = v1.replace(self.espinsec, u'')
            v2 = v2.replace(u'-', '')
            v2 = v2.replace(self.espinsec, u'')
     
            # on retourne le résultat de la comparaison
            return locale.strcoll(v1, v2)
    Voilà comment on l'utilise (ici sur un exemple de test):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    L = ['pèche', 'PÈCHE', 'pêche', 'PÊCHE', 'péché', 'PÉCHÉ', 'pécher', 'pêcher']
    compfr = Compfr()
    L.sort(cmp=compfr)
    for mot in L:
        print mot
    pèche
    PÈCHE
    pêche
    PÊCHE
    péché
    PÉCHÉ
    pécher
    pêcher
    La liste à trier est supposée être composée de mots encodés soit en unicode, soit en utf-8. Si ce n'est pas en utf-8, on peut donner l'encodage au lancement de l'instance de classe Compfr(). De ce fait, les comparaisons sont faites en unicode.

    Si on est dans Python 3.x, l'argument cmp de la méthode sort n'existe plus. Grâce au module functools et à sa fonction cmp_to_key, on peut utiliser la même méthode de comparaison avec l'argument key de sort:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    L= [u'vicennal', u'vice-consul', u'vice-roi', u'vice-président', u'vice' +  u'\xA0' + u'versa', u'vice-versa', u'vicésimal']
     
    compfr = Compfr()
    L.sort(key=cmp_to_key(compfr))
    for mot in L:
        print mot
    vice-consul
    vicennal
    vice-président
    vice-roi
    vicésimal
    vice versa
    vice-versa
    Bien entendu, le cas des voyelles liées comme œ,Æ, ... est traité!

    Essaie pour voir si ça te convient.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  6. #6
    Membre habitué Avatar de KINENVEU
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 184
    Points : 131
    Points
    131
    Par défaut
    merci pour vos reponses.

    Je trouve la solution de "mont29" elegante.
    Je l'utiliserai en plan B (car je tiens a eviter de faire les conversions a la main)

    La solution de "tyrtamos" correspond tout a fait a ce que je cherche.
    Je vais la tester de ce pas et je vous tiens au courant.

    merci encore.

  7. #7
    Membre habitué Avatar de KINENVEU
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 184
    Points : 131
    Points
    131
    Par défaut
    Je n'arrive pas a faire marcher la solution de "tyrtamos".

    voici le code :
    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
    # encoding:UTF-8
     
    import locale
     
    class Compfr(object):
     
        def __init__(self, decod='utf-8'):
            self.decod = decod
            locale.setlocale(locale.LC_ALL, '')
            self.espinsec = u'\xA0' # espace insécable
     
        def __call__(self, v1, v2):
     
            # on convertit en unicode si nécessaire
            if isinstance(v1, str):
                v1 = v1.decode(self.decod)
            if isinstance(v2, str):
                v2 = v2.decode(self.decod)
     
            # on retire les tirets et les blancs insécables
            v1 = v1.replace(u'-', u'')
            v1 = v1.replace(self.espinsec, u'')
            v2 = v2.replace(u'-', '')
            v2 = v2.replace(self.espinsec, u'')
     
            # on retourne le résultat de la comparaison
            return locale.strcoll(v1, v2)
     
     
    if __name__ == "__main__":
      ## L = ['pèche', 'PÈCHE', 'pêche', 'PÊCHE', 'péché', 'PÉCHÉ', 'pécher', 'pêcher']
      L = ["œil", "Æ", "être", "île", "éveil", "aba", "afa", "oda", "ofa", "eve", "ila", "ilf"]
      ## compfr = Compfr()
      compfr = Compfr("iso-8859-7")
      L.sort(cmp=compfr)
      for mot in L:
        print mot
    J'ai rajoute a cause des accents dans les commentaires.

    Ensuite, j'ai change le type d'encodage (un peu au hasard)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    compfr = Compfr("iso-8859-7")
    car j'avais une erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UnicodeDecodeError: 'utf8' codec can't decode byte 0xc6 in position 0: unexpected end of data
    sinon.

    Enfin, j'ai change la liste test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    L = ["œil", "Æ", "être", "île", "éveil", "aba", "afa", "oda", "ofa", "eve", "ila", "ilf"]
    car elle est plus significative pour moi dans un 1er temps.

    J'obtiens
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    œil
    aba
    afa
    eve
    ila
    ilf
    oda
    ofa
    Æ
    éveil
    être
    île
    ce qui n'est pas du tout ce que j'attendais.

    Qu'est-ce que j'ai mal fait ?

  8. #8
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Avec ta liste et ton code, corrigé de "compfr = Compfr('utf-8')", j’obtiens bien le bon résultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    aba
    Æ
    afa
    être
    eve
    éveil
    ila
    île
    ilf
    oda
    œil
    ofa
    Mais pour cela, Python doit savoir sous quel encodage tu écris tes textes! Il faut donc commencer par mettre au début de ta page:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    # -*- coding: utf-8 -*-
    Et, bien entendu, ton éditeur doit pouvoir éditer et enregistrer en utf-8.

    Enfin, quand tu affiches, il faut que la chaine soit encodée en fonction de ce que supporte ton afficheur. Si c'est de l'utf-8, tant mieux, il n'y a rien à faire. Si c'est un éditeur Windows, comme avec PyScripter par exemple, l'encodage est 'cp1252'. Il faut dans ce cas corriger la chaine à l'impression avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for mot in L:
        print mot.decode('utf-8').encode('cp1252')
    Ok?
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  9. #9
    Membre habitué Avatar de KINENVEU
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 184
    Points : 131
    Points
    131
    Par défaut
    Ca ne marche toujours pas. :-(

    J'ai la meme erreur qui revient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Traceback (most recent call last):
      File "toto.py", line 36, in <module>
        L.sort(cmp=compfr)
      File "toto.py", line 16, in __call__
        v1 = v1.decode(self.decod)
      File "C:\Python25\lib\encodings\utf_8.py", line 16, in decode
        return codecs.utf_8_decode(input, errors, True)
    UnicodeDecodeError: 'utf8' codec can't decode byte 0xc6 in position 0: unexpected end of data
    >Exit code: 1
    C'est pour cela que j'avais essaye avec un autre codec.

    Question bonus :
    quel est la difference entre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    # -*- coding: utf-8 -*-
    et ?

    Par contre, en mettant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    compfr=Compfr('cp1252')
    ca a l'air de marcher.
    Je vais essayer avec mon application pour voir si ca marche aussi.

    En pratique, comment fait-on pour determiner le codec necessaire ?

  10. #10
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Je ne connais pas tes outils de développement. Mais si cp1252 a l'air de marcher, c'est peut-être que ton texte est encodé en cp1252? Dans ce cas, essaie de commencer ta page de code par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    # -*- coding: cp1252 -*-
    Tu n'es pas obligé de travailler en utf-8! Mais tu dois savoir sous quel encodage tu travailles.

    Voilà une astuce (Python 2.7). Dans ton éditeur, écris:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ch = "é"
    print type(ch)
    print len(ch)
    Si le type de ch est 'str' et la longueur est 2: c'est de l'utf-8.

    Si le type de ch est 'str' et c'est la longueur 1, ce n'est pas de l'utf-8, mais ça peut être beaucoup d'encodages: cp1252 (=Windows), cp850 (DOS), latin1 ou iso-8859 (standard de l'Europe de l'ouest).
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  11. #11
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Pourquoi ne pas faire confiance au système ?
    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
    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
    #
    #
    import locale
     
    class Compfr(object):
     
        def __init__(self):
            from sys import stdin
            self.decod = stdin.encoding
            locale.setlocale(locale.LC_ALL, '')
            self.espinsec = u"\xA0"
     
        def __call__(self, v1, v2):
            # on convertit en unicode si nécessaire
            if isinstance(v1, str):
                v1 = v1.decode(self.decod)
            if isinstance(v2, str):
                v2 = v2.decode(self.decod)
     
            # on retire les tirets et les blancs insécables
            v1 = v1.replace(u'-', u'')
            v1 = v1.replace(self.espinsec, u'')
            v2 = v2.replace(u'-', '')
            v2 = v2.replace(self.espinsec, u'')
     
            # on retourne le résultat de la comparaison
            return locale.strcoll(v1, v2)
     
     
    if __name__ == "__main__":
        import sys
        #L = ['pèche', 'PÈCHE', 'pêche', 'PÊCHE', 'péché', 'PÉCHÉ', 'pécher', 'pêcher']
        L = ["œil", "Æ", "être", "île", "éveil", "aba", "afa", "oda", "ofa", "eve", "ila", "ilf"]
        compfr = Compfr()
        L.sort(cmp=compfr)
        for mot in L:
            print mot
    @+
    Merci d'utiliser le forum pour les questions techniques.

  12. #12
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour PauseKawa

    A mon avis, sys.stdin.encoding donne l'encodage de l'entrée console qu'on aurait avec raw_input, mais pas l'encodage des chaines écrites dans le texte du code Python. C'est pour ça qu'il doit être précisé au début de ce code avec "# -*- coding: utf-8 -*-". Sinon, cette ligne serait inutile.

    Mais, bien sûr, si on dit à Python avec cette ligne que le texte du code est encodé 'utf-8', ça doit être vrai! Et donc que l'éditeur de texte utilisé est configuré pour ça. On peut le vérifier, une fois le code enregistré sur disque, avec un éditeur hexadécimal indépendant, qui en lisant directement le fichier .py dira comment sont codés les caractères accentués:

    - si le 'é' est codé E9 en hexadécimal, c'est du cp1252 (Windows) ou latin1/iso8859-1
    - si le 'é' est codé 82 en hexadécimal, c'est du cp850 (MSDOS)
    - si le 'é' est codé C3 A9 en hexadécimal, c'est de l'utf-8
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  13. #13
    Membre habitué Avatar de KINENVEU
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 184
    Points : 131
    Points
    131
    Par défaut
    Pour synthetiser :
    Si l'on connait l'encodage,
    1. on decode les string en unicode
    2. on importe le module "locale"
    3. on initialise "locale"
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      locale.setlocale(locale.LC_ALL, '')
    4. on utilise la methode "locale.strcoll" pour comparer les string.
    5. on peut verifier les resultats avec les exemples ici :http://www-clips.imag.fr/geta/gilles...-francais.html


    (J'ai l'impression que le bloc ou l'on remplace les tirets et espaces insecables est inutile, a confirmer)

    Donc, je retiens que ca fonctionne a condition de connaitre l'encodage des string a trier.

    Il faut voir que la, on faisait le test sur une liste fournie dans le code source.
    Mais dans mon application, je recupere ces strings dans des fichiers de donnees.
    Comme les origines de ces fichiers sont differentes, je peux me retrouver avec le cas ou l'encodage est different d'un fichier a l'autre ...

    Comment changer l'encodage d'un string ?

    Sachant que lorsque j'essaie myStr.decode(oldCode).encode(newCode), ca plante dans la majoritee des cas.

  14. #14
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par KINENVEU Voir le message
    J'ai l'impression que le bloc ou l'on remplace les tirets et espaces insecables est inutile, a confirmer)
    Je ne l'ai ajouté que pour traiter complètement (ou presque) les cas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    L = [u'vice-consul', u'vicennal', u'vice-président', u'vice-roi', u'vicésimal', u'vice' + u'\xA0' + u'versa', u'vice-versa']
    Mais tu peux ne pas en avoir besoin.

    Citation Envoyé par KINENVEU Voir le message
    Donc, je retiens que ca fonctionne a condition de connaitre l'encodage des string a trier.
    J'ai bien peur qu'on ne puisse y échapper... Dans la mesure où les caractères accentués ne sont pas toujours codés de la même façon d'un encodage à l'autre.

    Cependant, s'il s'agit de fichiers, cela peut dépendre du domaine dans lequel on est. L'encodage latin1/iso8859-1 est assez courant. On peut même lui préférer l'iso8859-15 qui contient en plus '€'. Mais si on est dans un domaine dans lequel on peut trouver des textes issus de pays plus lointains, l'utf-8 a des capacités plus grandes. Et le 'cp850' ne sera trouvé que dans des fichiers créés par des logiciels assez anciens (j'ai déjà trouvé cela dans une base de données issue du BDE de Delphi)

    A noter que dans certains cas, le fichier à lire démarre par quelques octets qui "signent" l'encodage: on appelle ça un "BOM" (http://fr.wikipedia.org/wiki/Marque_...dre_des_octets).

    Citation Envoyé par KINENVEU Voir le message
    Comment changer l'encodage d'un string ?
    Quand on connait l'encodage de départ (par exemple 'utf-8') et l'encodage d'arrivée (par exemple 'latin1'), c'est facile:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ch = ch.decode('utf-8').encode('latin1)
    En fait, pour convertir, on passe toujours par l'intermédiaire de l'unicode interne (une sorte d'utf-16 simplifiée). Et ça marche très bien: quand il y a une erreur, c'est qu'on s'est trompé dans l'encodage de départ.

    Et si on veut lire un fichier texte en connaissant son encodage, il faut utiliser le module codecs.

    Il faut investir un peu de temps pour comprendre et maitriser ces problèmes d'encodage, parce que n'importe quel problème de saisie, traitement et affichage de texte y sera confronté. Et ce n'est spécifique ni à Python, ni à la méthode de tri choisie.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  15. #15
    Membre habitué Avatar de KINENVEU
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 184
    Points : 131
    Points
    131
    Par défaut
    Citation Envoyé par tyrtamos Voir le message
    Bonjour,

    Citation Envoyé par KINENVEU Voir le message
    (J'ai l'impression que le bloc ou l'on remplace les tirets et espaces insecables est inutile, a confirmer)
    Je ne l'ai ajouté que pour traiter complètement (ou presque) les cas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    L = [u'vice-consul', u'vicennal', u'vice-président', u'vice-roi', u'vicésimal', u'vice' + u'\xA0' + u'versa', u'vice-versa']
    Mais tu peux ne pas en avoir besoin.
    oui desole.
    je m'etais trompe en testant.
    tu as raison, on en a besoin pour que ca fonctionne correctement.

    Globalement, je crois que la solution de "tyrtamos" repond bien au probleme de tri.
    Merci beaucoup.
    D'ailleurs, je crois qu'elle aurait sa place dans la FAQ. ;-)


    En bonus, pour ce qui comme moi sont leger sur les unicodes, je vous conseille la lecture de ceci:
    http://docs.python.org/howto/unicode
    http://python.developpez.com/cours/
    Bien que je n'ai toujours pas compris comment definir le codec pour l'output de scite(mais ca c'est un autre sujet),
    ca m'a aide a mieux comprendre les concepts.

  16. #16
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par KINENVEU Voir le message
    Globalement, je crois que la solution de "tyrtamos" repond bien au probleme de tri.
    Pour "rendre à César, etc...", cette solution est issue du fil: http://www.developpez.net/forums/d10...-strings-utf8/ (et merci à dividee!)

    [Edit] pour être complet, je viens d'ajouter cette solution comme tuto sur mon site: http://python.jpvweb.com/mesrecettes...naire_francais. Y compris le tri indexé et la recherche rapide par dichotomie qui utilise la même fonction de comparaison.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Parser un JSON avec des variables avec des "-" et des ":"
    Par Quentin33 dans le forum Windows Phone
    Réponses: 2
    Dernier message: 22/05/2011, 01h04
  2. Réponses: 4
    Dernier message: 02/04/2008, 17h51
  3. function stripslashes() avec des string
    Par rigel dans le forum Langage
    Réponses: 2
    Dernier message: 04/07/2006, 08h53
  4. comment faire switch avec des strings ?
    Par ilimo dans le forum C++
    Réponses: 2
    Dernier message: 18/04/2006, 21h08
  5. petit souci avec des variables avec des fonctions psql
    Par dust62 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 02/04/2005, 13h45

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