Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

sort liste accent français

3 réponses
Avatar
Laurent
Bonjour,

J'ai un problème :

Si dans un shell python, vous lancez :

'é' > 'z'

Vous obtenez true. Ce qui veut dire que si vous classez des par exemple

toto=['a','b','f','é','z']
print toto.sort()

On obtient l'équivalent de :

['a','b','f','z','é']

Ce qui n'est pas top :-)

Pouvez vous m'aider sur ce point ???

PS : J'ai le même comportement avec le zcatalog de zope lors d'un sort_on.
Même si je lance le zope avec la bonne locale (fr_FR) sous linux.

Merci d'avance

Laurent

3 réponses

Avatar
Laurent
Merci pour cette astuce, est-ce possible d'utiliser un tel truc avec la
fonction cmp(). Par exemple :

def myCompare(self,a,b):
return cmp(a,b)

Ou a et b sont des chaines avec potentielement des accents ???

Merci, encore pour l'astuce.

Eric Brunel wrote:

Laurent wrote:
Bonjour,

J'ai un problème :

Si dans un shell python, vous lancez :

'é' > 'z'

Vous obtenez true. Ce qui veut dire que si vous classez des par exemple

toto=['a','b','f','é','z']
print toto.sort()

On obtient l'équivalent de :

['a','b','f','z','é']

Ce qui n'est pas top :-)

Pouvez vous m'aider sur ce point ???


La comparaison par <, > et autres compare simplement les codes des
caractères, donc ça ne peut pas marcher, vu que dans à peu près tous les
encodages, toutes les lettres accentuées ont des codes supérieurs à 127,
et sont donc "après" toutes les lettres non-accentuées.

Pour faire ce que tu veux, tu peux utiliser la fonction strcoll du module
locale: http://docs.python.org/lib/module-locale.html#l2h-2215

En lançant python dans un environnement où la langue par défaut est le
français (par exemple via la commande "LANG=fr_FR python" sous Linux; sous
Windows, je ne sais pas - je suppose que c'est "magique"), tu peux faire:

import locale
locale.setlocale(locale.LC_ALL, '')




'LC_CTYPE=en_GB;LC_NUMERIC=en_GB;LC_TIME=en_GB;LC_COLLATE=en_GB;LC_MONETARY=en_GB;LC_MESSAGES=en_GB;LC_PAPER=fr_FR;LC_NAME=fr_FR;LC_ADDRESS=fr_FR;LC_TELEPHONE=fr_FR;LC_MEASUREMENT=fr_FR;LC_IDENTIFICATION=fr_FR'

toto=['a','b','f','é','z']
toto.sort(locale.strcoll)
toto
['a', 'b', 'xe9', 'f', 'z']




Et le "é" (c'est à dire le 'xe9') est bien là où il faut.





Avatar
Eric Brunel
Laurent wrote:
Bonjour,

J'ai un problème :

Si dans un shell python, vous lancez :

'é' > 'z'

Vous obtenez true. Ce qui veut dire que si vous classez des par exemple

toto=['a','b','f','é','z']
print toto.sort()

On obtient l'équivalent de :

['a','b','f','z','é']

Ce qui n'est pas top :-)

Pouvez vous m'aider sur ce point ???


La comparaison par <, > et autres compare simplement les codes des caractères,
donc ça ne peut pas marcher, vu que dans à peu près tous les encodages, toutes
les lettres accentuées ont des codes supérieurs à 127, et sont donc "après"
toutes les lettres non-accentuées.

Pour faire ce que tu veux, tu peux utiliser la fonction strcoll du module locale:
http://docs.python.org/lib/module-locale.html#l2h-2215

En lançant python dans un environnement où la langue par défaut est le français
(par exemple via la commande "LANG=fr_FR python" sous Linux; sous Windows, je ne
sais pas - je suppose que c'est "magique"), tu peux faire:

import locale
locale.setlocale(locale.LC_ALL, '')
'LC_CTYPE=en_GB;LC_NUMERIC=en_GB;LC_TIME=en_GB;LC_COLLATE=en_GB;LC_MONETARY=en_GB;LC_MESSAGES=en_GB;LC_PAPER=fr_FR;LC_NAME=fr_FR;LC_ADDRESS=fr_FR;LC_TELEPHONE=fr_FR;LC_MEASUREMENT=fr_FR;LC_IDENTIFICATION=fr_FR'



toto=['a','b','f','é','z']
toto.sort(locale.strcoll)
toto
['a', 'b', 'xe9', 'f', 'z']




Et le "é" (c'est à dire le 'xe9') est bien là où il faut.
--
- Eric Brunel <eric (underscore) brunel (at) despammed (dot) com> -
PragmaDev : Real Time Software Development Tools - http://www.pragmadev.com



Avatar
Eric Brunel
Laurent wrote:
Merci pour cette astuce, est-ce possible d'utiliser un tel truc avec la
fonction cmp(). Par exemple :

def myCompare(self,a,b):
return cmp(a,b)

Ou a et b sont des chaines avec potentielement des accents ???


La fonction locale.strcoll est l'équivalent "localisé" de cmp; donc remplace
simplement cmp(a,b) par locale.strcoll(a,b) et ça marche.

En passant, tout ça est expliqué dans la doc (vu que c'est là que je l'ai trouvé...)
--
- Eric Brunel <eric (underscore) brunel (at) despammed (dot) com> -
PragmaDev : Real Time Software Development Tools - http://www.pragmadev.com