Użyj localei to metody sortowania ciągów, aby sortować naturalnie zgodnie z bieżącymi ustawieniami narodowymi.
u0b34a0f6ae
Odpowiedzi:
519
Podstawowa odpowiedź:
mylist =["b","C","A"]
mylist.sort()
To modyfikuje twoją oryginalną listę (tzn. Sortuje na miejscu). Aby uzyskać posortowaną kopię listy, bez zmiany oryginału, użyj sorted()funkcji:
for x in sorted(mylist):print x
Jednak powyższe przykłady są nieco naiwne, ponieważ nie uwzględniają ustawień regionalnych i wykonują sortowanie z rozróżnianiem wielkości liter. Możesz skorzystać z opcjonalnego parametru, keyaby określić niestandardową kolejność sortowania (alternatywa, używając cmp, jest przestarzałym rozwiązaniem, ponieważ musi być oceniana wiele razy - keyjest obliczana tylko raz dla elementu).
Tak więc, aby posortować według aktualnych ustawień regionalnych, biorąc pod uwagę reguły specyficzne dla języka ( cmp_to_keyjest funkcją pomocniczą z funools):
import locale
locale.setlocale(locale.LC_ALL,'en_US.UTF-8')# vary depending on your lang/localeassert sorted((u'Ab', u'ad', u'aa'),
key=cmp_to_key(locale.strcoll))==[u'aa', u'Ab', u'ad']
Ostatnia uwaga: zobaczysz przykłady sortowania bez rozróżniania wielkości liter, które używają tej lower()metody - są one niepoprawne, ponieważ działają tylko dla podzbioru znaków ASCII. Te dwie wartości są błędne w przypadku danych innych niż angielskie:
# this is incorrect!
mylist.sort(key=lambda x: x.lower())# alternative notation, a bit faster, but still wrong
mylist.sort(key=str.lower)
Słuszna uwaga. Zostawię obecny przykład bez zmian, ponieważ początkujący prawdopodobnie łatwiej będzie zobaczyć, co się dzieje, ale będę o tym pamiętać w przyszłości.
Eli Courtwright
1
Jeśli ktoś jest ciekawy, wydajność list.sort () można znaleźć tutaj
Hari Ganesan
1
@BornToCode: 1- Wiem . Spójrz na wersję (2008), na którą odpowiada mój komentarz (mój komentarz dotyczy niepotrzebnego użycia lambda). 2- sortowanie znaków spoza ASCII to duży osobny temat. Można zastosować PyICU zamiast rozwiązania opartego na ustawieniach regionalnych.
jfs
1
@Dmitry To dlatego, że są drukowane wartość zwracaną przez funkcję sortowania w nazwie [1, 2, 3].sort(). Gdy sort()sortuje listę w miejscu (tj. Zmienia listę bezpośrednio), nie zwraca ona posortowanej listy, a tak naprawdę niczego nie zwraca, więc drukowana jest instrukcja drukowania None. Jeśli zapisałeś listę do zmiennej, powiedzmy x, wywołanej x.sort(), print(x)zobaczysz posortowaną listę.
import locale
locale.setlocale(locale.LC_ALL,'en_US.UTF-8')# vary depending on your lang/localeassert sorted((u'Ab', u'ad', u'aa'), cmp=locale.strcoll)==[u'aa', u'Ab', u'ad']# Without using locale.strcoll you get:assert sorted((u'Ab', u'ad', u'aa'))==[u'Ab', u'aa', u'ad']
Poprzedni przykład mylist.sort(key=lambda x: x.lower())będzie działał dobrze dla kontekstów tylko ASCII.
Ale w jaki sposób obsługuje to reguły sortowania specyficzne dla języka? Czy bierze pod uwagę ustawienia regionalne?
Nie, list.sort()jest ogólną funkcją sortowania. Jeśli chcesz sortować zgodnie z regułami Unicode, musisz zdefiniować niestandardową funkcję klawisza sortowania. Możesz spróbować użyć modułu pyuca , ale nie wiem, jak jest kompletny.
Stare pytanie, ale jeśli chcesz przeprowadzić sortowanie uwzględniające ustawienia regionalne bez ustawiania,locale.LC_ALL możesz to zrobić, korzystając z biblioteki PyICU zgodnie z sugestią podaną w tej odpowiedzi :
names =['Jasmine','Alberto','Ross','dig-dog']print("The solution for this is about this names being sorted:",sorted(names, key=lambda name:name.lower()))
locale
i to metody sortowania ciągów, aby sortować naturalnie zgodnie z bieżącymi ustawieniami narodowymi.Odpowiedzi:
Podstawowa odpowiedź:
To modyfikuje twoją oryginalną listę (tzn. Sortuje na miejscu). Aby uzyskać posortowaną kopię listy, bez zmiany oryginału, użyj
sorted()
funkcji:Jednak powyższe przykłady są nieco naiwne, ponieważ nie uwzględniają ustawień regionalnych i wykonują sortowanie z rozróżnianiem wielkości liter. Możesz skorzystać z opcjonalnego parametru,
key
aby określić niestandardową kolejność sortowania (alternatywa, używająccmp
, jest przestarzałym rozwiązaniem, ponieważ musi być oceniana wiele razy -key
jest obliczana tylko raz dla elementu).Tak więc, aby posortować według aktualnych ustawień regionalnych, biorąc pod uwagę reguły specyficzne dla języka (
cmp_to_key
jest funkcją pomocniczą z funools):I na koniec, jeśli potrzebujesz, możesz określić niestandardowe ustawienia regionalne do sortowania:
Ostatnia uwaga: zobaczysz przykłady sortowania bez rozróżniania wielkości liter, które używają tej
lower()
metody - są one niepoprawne, ponieważ działają tylko dla podzbioru znaków ASCII. Te dwie wartości są błędne w przypadku danych innych niż angielskie:źródło
mylist.sort(key=str.lower)
jest szybszy.[1, 2, 3].sort()
. Gdysort()
sortuje listę w miejscu (tj. Zmienia listę bezpośrednio), nie zwraca ona posortowanej listy, a tak naprawdę niczego nie zwraca, więc drukowana jest instrukcja drukowaniaNone
. Jeśli zapisałeś listę do zmiennej, powiedzmyx
, wywołanejx.sort()
,print(x)
zobaczysz posortowaną listę.Warto również zwrócić uwagę na
sorted()
funkcję:Zwraca nową, posortowaną wersję listy bez zmiany oryginalnej listy.
źródło
To naprawdę takie proste :)
źródło
Właściwy sposób sortowania ciągów znaków to:
Poprzedni przykład
mylist.sort(key=lambda x: x.lower())
będzie działał dobrze dla kontekstów tylko ASCII.źródło
Proszę użyć funkcji sorted () w Python3
źródło
Nie,
list.sort()
jest ogólną funkcją sortowania. Jeśli chcesz sortować zgodnie z regułami Unicode, musisz zdefiniować niestandardową funkcję klawisza sortowania. Możesz spróbować użyć modułu pyuca , ale nie wiem, jak jest kompletny.źródło
Stare pytanie, ale jeśli chcesz przeprowadzić sortowanie uwzględniające ustawienia regionalne bez ustawiania,
locale.LC_ALL
możesz to zrobić, korzystając z biblioteki PyICU zgodnie z sugestią podaną w tej odpowiedzi :Następnie zadzwoń np .:
Działa to dla mnie bez instalowania ustawień narodowych ani zmiany innych ustawień systemowych.
(Zostało to już zasugerowane w powyższym komentarzu , ale chciałem nadać mu większą rangę, ponieważ na początku sam tego brakowało).
źródło
Przypuszczać
s = "ZWzaAd"
Aby posortować powyżej ciągu, proste rozwiązanie będzie poniżej jednego.
źródło
źródło
Wynik
źródło
To proste: https://trinket.io/library/trinkets/5db81676e4
score = score.split (',') for x in sorted (score): print (x)
źródło