184 votes

trier des listes sans tenir compte de la casse, sans mettre le résultat en minuscules ?

J'ai une liste de chaînes de caractères comme celle-ci :

['Aden', 'abel']

Je veux trier les éléments, sans tenir compte de la casse. Donc je veux obtenir :

['abel', 'Aden']

Mais j'obtiens le contraire avec sorted() o list.sort() car les majuscules apparaissent avant les minuscules.

Comment puis-je ignorer l'affaire ? J'ai vu des solutions qui consistent à mettre en minuscules tous les éléments de la liste, mais je ne veux pas changer la casse des éléments de la liste.

269voto

Lars Wirzenius Points 12197

Dans Python 3.3+, il existe la fonction str.casefold qui est spécialement conçue pour les correspondances sans boîtier :

sorted_list = sorted(unsorted_list, key=str.casefold)

En Python 2, utilisez lower() :

sorted_list = sorted(unsorted_list, key=lambda s: s.lower())

Cela fonctionne à la fois pour les chaînes normales et unicode, puisqu'elles ont toutes deux un caractère lower méthode.

Dans Python 2, cela fonctionne pour un mélange de chaînes normales et unicode, puisque les valeurs des deux types peuvent être comparées entre elles. Python 3 ne fonctionne pas de cette manière : vous ne pouvez pas comparer une chaîne d'octets et une chaîne unicode, donc en Python 3 vous devriez faire la chose la plus saine et ne trier que les listes d'un seul type de chaîne.

>>> lst = ['Aden', u'abe1']
>>> sorted(lst)
['Aden', u'abe1']
>>> sorted(lst, key=lambda s: s.lower())
[u'abe1', 'Aden']

49voto

jamylak Points 38094
>>> x = ['Aden', 'abel']
>>> sorted(x, key=str.lower) # Or unicode.lower if all items are unicode
['abel', 'Aden']

En Python 3 str est unicode, mais en Python 2, vous pouvez utiliser cette approche plus générale qui fonctionne à la fois pour str y unicode :

>>> sorted(x, key=lambda s: s.lower())
['abel', 'Aden']

12voto

Ashwini Chaudhary Points 94431

Vous pouvez également essayer ceci pour trier la liste sur place :

>>> x = ['Aden', 'abel']
>>> x.sort(key=lambda y: y.lower())
>>> x
['abel', 'Aden']

7voto

M14 Points 323

Cela fonctionne en Python 3 et n'implique pas de mettre le résultat en minuscules ( !).

values.sort(key=str.lower)

4voto

major Points 71

En python3, vous pouvez utiliser

list1.sort(key=lambda x: x.lower()) #Case In-sensitive             
list1.sort() #Case Sensitive

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X