Odpowiedzi:
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, key
aby określić niestandardową kolejność sortowania (alternatywa, używając cmp
, 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):
sorted(mylist, key=cmp_to_key(locale.strcoll))
I na koniec, jeśli potrzebujesz, możesz określić niestandardowe ustawienia regionalne do sortowania:
import locale
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') # vary depending on your lang/locale
assert 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)
mylist.sort(key=str.lower)
jest szybszy.
[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ę.
Warto również zwrócić uwagę na sorted()
funkcję:
for x in sorted(list):
print x
Zwraca nową, posortowaną wersję listy bez zmiany oryginalnej listy.
Właściwy sposób sortowania ciągów znaków to:
import locale
locale.setlocale(locale.LC_ALL, 'en_US.UTF-8') # vary depending on your lang/locale
assert 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.
Proszę użyć funkcji sorted () w Python3
items = ["love", "like", "play", "cool", "my"]
sorted(items2)
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 :
import icu # PyICU
def sorted_strings(strings, locale=None):
if locale is None:
return sorted(strings)
collator = icu.Collator.createInstance(icu.Locale(locale))
return sorted(strings, key=collator.getSortKey)
Następnie zadzwoń np .:
new_list = sorted_strings(list_of_strings, "de_DE.utf8")
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).
Albo może:
names = ['Jasmine', 'Alberto', 'Ross', 'dig-dog']
print ("The solution for this is about this names being sorted:",sorted(names, key=lambda name:name.lower()))
To proste: https://trinket.io/library/trinkets/5db81676e4
scores = '54 - Alice,35 - Bob,27 - Carol,27 - Chuck,05 - Craig,30 - Dan,27 - Erin,77 - Eve,14 - Fay,20 - Frank,48 - Grace,61 - Heidi,03 - Judy,28 - Mallory,05 - Olivia,44 - Oscar,34 - Peggy,30 - Sybil,82 - Trent,75 - Trudy,92 - Victor,37 - Walter'
score = score.split (',') for x in sorted (score): print (x)
locale
i to metody sortowania ciągów, aby sortować naturalnie zgodnie z bieżącymi ustawieniami narodowymi.