Ordre lexicographique Python
Répondre à la discussion
Affichage des résultats 1 à 13 sur 13

Ordre lexicographique Python



  1. #1
    Latinus

    Ordre lexicographique Python


    ------

    Bonjour à tous,

    J'avais une question à propos de l'ordre lexicographique en Python. En effet, je n'arrive pas trop à saisir pourquoi :

    print('ABc'<'AbC')

    affiche True.

    Pour essayer de comprendre, j'ai écrit un programme qui classe une chaîne dans l'ordre lexicographique, mais il ne fait pas ce que je veux, et je ne vois pas l'erreur. Le voici :

    x=str(input('Chaîne :'))
    a=list(x)
    print(str(a.sort()))

    Et ça me sort None.

    Merci de votre aide !

    Bonne journée,

    Latinus.

    -----

  2. #2
    Dlzlogic

    Re : Ordre lexicographique Python

    Bonjour,
    Concernant l'ordre des chaines, c'est directement lié à l'ordre dans la table des caractères.
    En informatique, un caractère n'existe pas, c'est la représentation, compréhensible par l'homme, d'un nombre.
    Je crois qu'en informatique, comme partout, on se brule les doigts en brulant le étapes.

  3. #3
    Latinus

    Re : Ordre lexicographique Python

    Bonsoir,

    Merci de votre réponse.

    Désolé, mais je n'ai toujours pas saisi. Je comprends bien comment sont comparés deux caractères seuls.

    Mais comment trouve-t-on la valeur qui code telle ou telle chaîne. Pourquoi 'ABc'<'AbC' ?

    J'ai justement le sentiment d'avoir loupé quelque chose, alors je suis à la recherche des étapes que j'ai brûlées afin de ne plus me brûler les doigts.

    Merci !
    Cordialement,
    Latinus.

  4. #4
    Dlzlogic

    Re : Ordre lexicographique Python

    Sa question est "pourquoi 'B' est plus petit que 'b' ?"
    La réponse : le code ASCII de 'B' est 66 le code ASCII de 'b' est 98. Donc B est plus petit que b
    Bien-sûr, je ne le sais pas par cœur, amis je l'ai imprimé en gros et collé en face de moi sur le mur. On trouve ce code ASCII dans tous les bouquins d'informatique.

  5. A voir en vidéo sur Futura
  6. #5
    pm42

    Re : Ordre lexicographique Python

    Recherche les code ascii pour commencer puis regarde le codage UTF (8 et 16).

  7. #6
    Latinus

    Re : Ordre lexicographique Python

    Bonsoir,

    Merci de votre réponse !
    En fait, le code de chaque caractère est mis à la suite du précédent...

    Bonne soirée !

    Latinus.

  8. #7
    Latinus

    Re : Ordre lexicographique Python

    Et mon programme au fait, qu'est-ce qui cloche ?

  9. #8
    pm42

    Re : Ordre lexicographique Python

    Citation Envoyé par Latinus Voir le message
    Et mon programme au fait, qu'est-ce qui cloche ?
    Sort ne te renvoie pas une nouvelle liste triée mais tri l'existante. Donc ton résultat est dans a et b ne contient rien.

  10. #9
    polo974

    Re : Ordre lexicographique Python

    Citation Envoyé par pm42 Voir le message
    Sort ne te renvoie pas une nouvelle liste triée mais tri l'existante. Donc ton résultat est dans a et b ne contient rien.
    c'est effectivement le piège de sort()...

    sinon pour les fonctions demandées:
    >>> ord('A')
    65
    >>> chr(65)
    'A'

    (mais pour les accents et l'utf8, ça se complique...)
    Jusqu'ici tout va bien...

  11. #10
    Latinus

    Re : Ordre lexicographique Python

    Bonjour,

    Merci beaucoup Polo !

    En effet, d'autres fonctions s'utilisent de la même manière que sort() si j'ai bien compris, comme append(...), reverse() ou remove(...).

    J'ai trouvé une d'autre manières de classer par ordre lexicographique, sans les fonctions chr(...) et ord(...).

    Pour classer les caractères d'une chaîne dans l'ordre lexicographique :

    x=input('Chaîne :') #c'est déjà un str
    a=list(x)
    a.sort()
    print(''.join(a)) #on convertit la liste en str

    Pour classer plusieurs (ici, deux) chaînes entre elles dans l'ordre lexicographique :

    x=input('Chaîne 1 :')
    y=input('Chaîne 2 :')
    a=[x,y]
    print(sorted(a))

    #autre fonction qui fait le même travail que sort(), sauf qu'elle prend un argument, et qu'elle peut permettre de créer une variable intermédiaire.

    Merci beaucoup de votre aide, on en apprend sur ce forum !

    Bonne journée,

    Latinus.

  12. #11
    Latinus

    Re : Ordre lexicographique Python

    Mais petite question : en Python, il faut prendre en compte le codage UTF-8 ?

  13. #12
    polo974

    Re : Ordre lexicographique Python

    Citation Envoyé par Latinus Voir le message
    Mais petite question : en Python, il faut prendre en compte le codage UTF-8 ?
    si tu dois échanger du texte accentué, il faut s'en préoccuper dès le début.
    (idem pour la traduction, si tu envisages des versions dans différentes langues)

    selon que tu codes en python 2 ou 3:
    https://docs.python.org/2/howto/unicode.html
    https://docs.python.org/3/howto/unicode.html

    et pour les français francophiles anglophobes...
    Jusqu'ici tout va bien...

  14. #13
    bobflux

    Re : Ordre lexicographique Python

    Le type string est simplement une suite d'octets (donc, du binaire) qui n'ont pas de signification particulière.

    Si on ajoute la notion d'encodage, par exemple "A" = 65, alors nos octets deviennent des caractères... à condition de ne pas se tromper d'encodage ! Par exemple, dans l'encodage Windows-1252, "œ" = 156, mais dans l'encodage ISO-8859-1, "œ" n'existe pas. C'est important de bien comprendre qu'une string ne "sait" pas dans quelle encodage elle est encodée : c'est simplement un tas d'octets. C'est le programmeur (ou le reste du programme) qui doit gérer cette information. Par conséquent, toutes les comparaisons et les tris se réfèrent simplement à des comparaisons binaires, qui n'ont généralement pas de sens pour du texte.

    Pour manipuler (et modifier) du texte, le mieux est d'utiliser des chaînes unicode (type unicode en python), ce qui résoud ce problème, puisque unicode représente tous les catactères de manière normalisée. Pour écrire ça dans un fichier, le mieux est encore d'utiliser utf-8 qui est l'encodage unicode binaire le plus courant...

    Mais on n'a pas encore trié nos strings! D'ailleurs, on ne peut pas encore le faire, puisqu'il nous manque une information : la locale. En effet, suivant le pays, l'ordre sera différent ! En Suède, "Å" ou "Ä" viennent après "Z" et d'ailleurs ça se prononce comme ça. En France, on met "Ä" avec "A".

    Et donc, la règle qui dit dans quel ordre on trie les lettres s'appelle une collation. On utilise le module locale :

    Code:
    >>> print " ".join(sorted(["ae", "AÈ", "ad", "af", "æ", "aé"], cmp=locale.strcoll ))
    ad ae aé AÈ æ af
    On voit que "a" et "A", bien que différents, sont triés au bon endroit, les accents sont gérés proprement, et bien sûr "æ" est décomposé et trié au bon endroit...

Discussions similaires

  1. Réponses: 0
    Dernier message: 14/09/2016, 21h53
  2. [PYTHON] Système différentiel d'ordre 2
    Par Razorr dans le forum Programmation et langages, Algorithmique
    Réponses: 5
    Dernier message: 16/06/2015, 09h13
  3. en python le multi tache n'est pas possible alors pourquoi les threads existent sur python?
    Par docEmmettBrown dans le forum Programmation et langages, Algorithmique
    Réponses: 5
    Dernier message: 10/06/2015, 15h47
  4. ordre lexicographique
    Par invitecb122d0a dans le forum Mathématiques du supérieur
    Réponses: 3
    Dernier message: 20/09/2008, 14h41
  5. Ordre lexicographique
    Par invite769a1844 dans le forum Mathématiques du supérieur
    Réponses: 25
    Dernier message: 09/07/2008, 23h51