web-dev-qa-db-fra.com

Tri par liste insensible à la casse, sans mettre le résultat en minuscule?

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

['Aden', 'abel']

Je veux trier les éléments, insensible à la casse. Donc je veux avoir:

['abel', 'Aden']

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

Comment puis-je ignorer le cas? J'ai déjà vu des solutions qui impliquent la mise en minuscule de tous les éléments de la liste, mais je ne souhaite pas changer la casse des éléments de la liste.

106
user975135

Ce qui suit fonctionne dans Python 2:

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

Cela fonctionne aussi bien pour les chaînes normales que pour les chaînes unicode, car elles ont toutes deux une méthode lower.

Dans Python 2, cela fonctionne pour un mélange de chaînes normales et unicodes, car les valeurs des deux types peuvent être comparées. Python 3 ne travaillez comme ça, cependant: vous ne pouvez pas comparer une chaîne d'octets et une chaîne unicode, donc dans Python 3, vous devriez faire ce qui est sain et ne trier que les listes d'un type de chaîne.

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

Depuis python 3.3, il y a aussi le str.casefold méthode spécialement conçue pour la correspondance sans cas et qui peut être utilisée à la place de str.lower:

sorted_list = sorted(unsorted_list, key=lambda s: s.casefold())
148
user25148
>>> x = ['Aden', 'abel']
>>> sorted(x, key=str.lower) # Or unicode.lower if all items are unicode
['abel', 'Aden']

Dans Python 3 str est unicode mais dans Python 2, vous pouvez utiliser cette approche plus générale qui fonctionne à la fois str. et unicode:

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

Vous pouvez aussi essayer ceci:

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

En python3, vous pouvez utiliser

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

Je l’ai fait de cette façon pour Python 3.3:

 def sortCaseIns(lst):
    lst2 = [[x for x in range(0, 2)] for y in range(0, len(lst))]
    for i in range(0, len(lst)):
        lst2[i][0] = lst[i].lower()
        lst2[i][1] = lst[i]
    lst2.sort()
    for i in range(0, len(lst)):
        lst[i] = lst2[i][1]

Ensuite, vous pouvez simplement appeler cette fonction:

sortCaseIns(yourListToSort)
1
Alexey Gorozhanov

Cela fonctionne avec Python 3 et n’implique pas la mise en minuscule du résultat (!).

values.sort(key=str.lower)
1
M14