Mam listę ciągów takich jak ta:
['Aden', 'abel']
Chcę posortować elementy bez rozróżniania wielkości liter. Więc chcę dostać:
['abel', 'Aden']
Ale w przypadku sorted()
lub jest odwrotnie list.sort()
, ponieważ wielkie litery pojawiają się przed małymi.
Jak mogę zignorować sprawę? Widziałem rozwiązania polegające na zmniejszaniu wielkości liter wszystkich elementów listy, ale nie chcę zmieniać wielkości liter w elementach listy.
Odpowiedzi:
W Pythonie 3.3+ istnieje
str.casefold
metoda zaprojektowana specjalnie do dopasowywania bezkrytycznego:W Pythonie 2 użyj
lower()
:Działa zarówno dla ciągów normalnych, jak i znaków Unicode, ponieważ oba mają
lower
metodę.W Pythonie 2 działa dla mieszanki ciągów normalnych i Unicode, ponieważ wartości obu typów można porównywać ze sobą. Jednak Python 3 nie działa w ten sposób: nie można porównywać ciągu bajtów i ciągu znaków Unicode, więc w Pythonie 3 należy postępować rozsądnie i sortować listy tylko jednego typu ciągu.
źródło
str.lower
funkcji ogólnej assorted(lst, key=str.lower)
or (Python 2) używająclower
metodystring
modułu assorted(lst, key=string.lower)
. Można również użyćstr.lower
dla łańcuchów w Pythonie 2, ale wtedy musiałoby to być użyteunicode.lower
dlaunicode
obiektów, podczas gdystring.lower
akceptuje oba (co, jak to ująłeś, prawdopodobnie nie jest tak naprawdę "rozsądnym" trybem działania).W Pythonie 3
str
jest to Unicode, ale w Pythonie 2 możesz użyć tego bardziej ogólnego podejścia, które działa zarówno w przypadku, jakstr
iunicode
:źródło
[['Aden'], ['abel']]
sorted(x,key=lambda i:i[0].lower())
Możesz także spróbować posortować listę lokalnie:
źródło
Działa to w Pythonie 3 i nie wymaga zmniejszania wyniku (!).
źródło
W python3 możesz użyć
źródło
Zrobiłem to w ten sposób dla Pythona 3.3:
Następnie możesz po prostu wywołać tę funkcję:
źródło
Sortowanie bez rozróżniania wielkości liter, sortowanie ciągu w miejscu , w Pythonie 2 LUB 3 (testowane w Pythonie 2.7.17 i Pythonie 3.6.9):
Klucz jest
key=str.lower
. Oto, jak wyglądają te polecenia tylko z poleceniami, co ułatwia kopiowanie i wklejanie, aby można było je przetestować:Zauważ, że jeśli twoje ciągi są ciągami znaków Unicode (jak
u'some string'
), to tylko w Pythonie 2 (NIE w Pythonie 3 w tym przypadku) powyższex.sort(key=str.lower)
polecenie zakończy się niepowodzeniem i wyświetli następujący błąd:Jeśli pojawi się ten błąd, albo zaktualizuj do Pythona 3, w którym obsługuje sortowanie Unicode, lub najpierw przekonwertuj ciągi znaków Unicode na ciągi ASCII, używając funkcji rozumienia list, na przykład:
Bibliografia:
źródło
Spróbuj tego
Wynik
['abel', 'Aden']
źródło