Warning: Undefined array key "DOKU_PREFS" in /home/clients/a4e6fc1ce1761b72982b805de0f418c4/web/python/mesrecettespython/inc/common.php on line 2082
tris_alpha [Les recettes Python de Tyrtamos]

Outils pour utilisateurs

Outils du site


tris_alpha

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Dernière révision Les deux révisions suivantes
tris_alpha [2011/09/19 07:32]
tyrtamos
tris_alpha [2011/09/19 08:11]
tyrtamos
Ligne 5: Ligne 5:
 Trier des chaines de caractères avec Python, c'est facile avec la méthode sort() ou la fonction sorted(), mais l'ordre que vous obtenez n'est pas en général celui d'un tri alphabétique français, mais celui de la police de caractères utilisée. Par exemple, la majuscule “X” se trouve **avant** la minuscule “a”. Quand aux caractères accentués, ils se trouvent derrière les minuscules non accentuées: 'à' est donc **après** 'x' Trier des chaines de caractères avec Python, c'est facile avec la méthode sort() ou la fonction sorted(), mais l'ordre que vous obtenez n'est pas en général celui d'un tri alphabétique français, mais celui de la police de caractères utilisée. Par exemple, la majuscule “X” se trouve **avant** la minuscule “a”. Quand aux caractères accentués, ils se trouvent derrière les minuscules non accentuées: 'à' est donc **après** 'x'
  
-Il existe une méthode de base intégrée à Python pour trier des mots selon le dictionnaire français, et décrite par ailleurs sur ce site ([[http://python.jpvweb.com/mesrecettespython/doku.php?id=tris_dictionnaire_francais]]), mais ce n'est pas ça qu'on va faire ici. En effet, ce ne sont pas forcément des mots qu'on va chercher à trier, mais des textes, et ceux-ci pourront contenir des caractères non-alphabétiques dans les mots, comme des caractères de ponctuation et des chiffres.+Il existe une méthode de base intégrée à Python pour trier des mots selon le dictionnaire français, et décrite par ailleurs sur ce site ([[http://python.jpvweb.com/mesrecettespython/doku.php?id=tris_dictionnaire_francais]]), mais ce n'est pas ça qu'on va faire ici. En effet, ce ne sont pas forcément des mots qu'on va chercher à trier, mais des chaines de caractères pouvant contenir des caractères non-alphabétiques dans les mots, comme des caractères de ponctuation, des espaces et des chiffres: on n'est plus dans un dictionnaire.
    
 Comme exemple d'application pratique, pensez au tri des chemins de fichiers sur disque qui, sous Windows, peuvent comporter des espaces, des caractères accentués et autres caractères non-alphanumériques ('#_$&!\:.;?', etc...). Comme exemple d'application pratique, pensez au tri des chemins de fichiers sur disque qui, sous Windows, peuvent comporter des espaces, des caractères accentués et autres caractères non-alphanumériques ('#_$&!\:.;?', etc...).
Ligne 12: Ligne 12:
  
 On va donc définir une méthode simplifiée pour la comparaison de 2 chaines de caractères:  On va donc définir une méthode simplifiée pour la comparaison de 2 chaines de caractères: 
- 
   * on définit l'ordre des caractères souhaité dans une chaine de caractères de référence (appelée 'alpha' dans le code)   * on définit l'ordre des caractères souhaité dans une chaine de caractères de référence (appelée 'alpha' dans le code)
- 
   * on fait la comparaison de 2 textes, caractère par caractère et de gauche à droite, en s'arrêtant au 1er caractère différent (ou au mot le plus court)   * on fait la comparaison de 2 textes, caractère par caractère et de gauche à droite, en s'arrêtant au 1er caractère différent (ou au mot le plus court)
  
Ligne 23: Ligne 21:
 </code> </code>
  
-Ce qui fait que les éventuels caractères non-français rencontrés seront tout de même traités, mais au delà des caractères français.+Ce qui fait que les éventuels caractères non-français rencontrés seront tout de même traités, mais au delà des caractères français, et dans l'ordre qu'ils ont dans la police de caractère.
  
-La fonction de comparaison prend 2 chaînes de caractères comme argument, et renvoie un nombre entier:+Comme le cmp() de Python, La fonction de comparaison prend 2 chaînes de caractères comme argument, et renvoie un nombre entier:
   * négatif si la 1ère chaîne est avant la seconde   * négatif si la 1ère chaîne est avant la seconde
   * nul si elles sont égales   * nul si elles sont égales
Ligne 170: Ligne 168:
 Les chemins auraient pu contenir des espaces, des caractères accentués, des chiffres et autres caractères non-alphanumériques($,%,#, etc...) pour autant, bien sûr, que ce soit permis par l'OS dans les chemins de fichiers sur disque. Les chemins auraient pu contenir des espaces, des caractères accentués, des chiffres et autres caractères non-alphanumériques($,%,#, etc...) pour autant, bien sûr, que ce soit permis par l'OS dans les chemins de fichiers sur disque.
  
-Avec la classe de comparaison, l'utilisation est très peu différente. On va prendre ici les même chemins, mais présentés en encodage 'utf-8':+Avec la comparaison sous forme de classe, l'utilisation est très peu différente.  
 + 
 +Pour déclencher des conversions d'encodage, on va prendre ici les même chemins, mais écrits en encodage 'utf-8':
  
 <code python> <code python>
Ligne 201: Ligne 201:
 </code> </code>
  
-Ce qui donne, bien entendu, le même résultat. les chaines non-unicodes ont été simplement convertis en les supposant encodées en 'utf-8'.+Ce qui donne, bien entendu, le même résultat. les chaines non-unicodes ont été simplement convertis en les supposant encodées en 'utf-8' comme demandé.
  
 Dans des cas plus complexes, on pourrait changer la chaine de comparaison alpha, ou empêcher la correction des voyelles liées. Dans des cas plus complexes, on pourrait changer la chaine de comparaison alpha, ou empêcher la correction des voyelles liées.
Ligne 454: Ligne 454:
   * x = chaîne à rechercher   * x = chaîne à rechercher
   * L = liste triée   * L = liste triée
-  * cmp = fonction de comparaison à utiliser (qui doit être la même que celle qui a servi au tri!)+  * cmp = fonction de comparaison à utiliser (**//qui doit être la même que celle qui a servi au tri!//**)
   * key = fonction de conversion utile à ce qu'on recherche   * key = fonction de conversion utile à ce qu'on recherche
  
Ligne 582: Ligne 582:
 print t print t
 </code> </code>
- Le résultat correct ([0,4999]est trouvé en... 2/10000 seconde! Ça vous suffira comme rapidité?+ Le résultat correct [0,4999] est trouvé en... 2/10000 seconde! Ça vous suffira comme rapidité?
  
  
tris_alpha.txt · Dernière modification: 2011/09/21 08:45 de tyrtamos