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.
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())
>>> 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']
Vous pouvez aussi essayer ceci:
>>> x = ['Aden', 'abel']
>>> x.sort(key=lambda y: y.lower())
>>> x
['abel', 'Aden']
En python3, vous pouvez utiliser
list1.sort(key=lambda x: x.lower()) #Case In-sensitive
list1.sort() #Case Sensitive
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)
Cela fonctionne avec Python 3 et n’implique pas la mise en minuscule du résultat (!).
values.sort(key=str.lower)