Ceea ce este cel mai bun mod de a crea o listă în ordine alfabetică în Python?
De bază a răspuns:
mylist = ["b", "C", "A"]
mylist.sort()
Acest lucru modifică lista inițială (adică felul în loc). Pentru a obține un sortate copie a listei, fără a schimba original, utilizați sortate()
funcția:
for x in sorted(mylist):
print x
Cu toate acestea, exemplele de mai sus sunt un pic naiv, pentru că ei don't ia locale în considerare, și de a efectua un caz sensibil de sortare. Puteți profita de parametrul opțional "cheie" pentru a specifica personalizate ordine de sortare (de alternativă, folosind cmp
, este o soluție învechită, cum trebuie să fie evaluate de mai multe ori - "cheie" este numai calculat o dată pe element).
Deci, pentru a sorta în funcție de curentul locale, luând limba-norme specifice în considerare (cmp_to_key
este un helper funcția de functools):
sorted(mylist, key=cmp_to_key(locale.strcoll))
Și în cele din urmă, dacă aveți nevoie, puteți specifica un custom locale pentru sortare:
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']
Ultima notă: veți vedea exemple de caz-insensibil sortare care folosesc mai mică()
metoda - acestea sunt incorecte, pentru că ei lucrează numai pentru ASCII subset de caractere. Cei doi sunt greșite pentru orice non-engleză de date:
# this is incorrect!
mylist.sort(key=lambda x: x.lower())
# alternative notation, a bit faster, but still wrong
mylist.sort(key=str.lower)
Este, de asemenea, demn de remarcat sortate()
funcția:
for x in sorted(list):
print x
Acesta întoarce o nouă, sortate în funcție de versiunea de o listă, fără a schimba lista inițială.
Modul corect de a sorta siruri de caractere este:
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']
Exemplul anterior a mylist.fel(cheie=lambda x: x.lower())
va funcționa bine pentru ASCII-doar contexte.
Dar cum acest lucru se ocupe de limbaj specifice de sortare reguli? Ia locale în considerare?
Nu, listă.sort()
este un generic funcția de sortare. Dacă doriți să sortați în funcție de Unicode reguli,'ll trebuie să definească un fel personalizat funcție-cheie. Puteți încerca să utilizați pyuca modul, dar nu't știu cât de completă este.
Vechea întrebare, dar dacă vrei să faci localizare-conștient de sortare fără a stabili locale.LC_ALL
puteți face acest lucru prin utilizarea PyICU biblioteca cum a sugerat de către acest răspuns:
``python import icu # PyICU
def sorted_strings(siruri de caractere, locale=None): daca locale este Nici unul: întoarce sortate(siruri de caractere) colator = terapie intensivă.Colator.createInstance(terapie intensivă.Locale(regionale)) întoarce sortate(siruri de caractere, cheie=colator.getSortKey) ``
Apoi sun-cu, de exemplu:
python new_list = sorted_strings(list_of_strings, "de_DE.utf8")
Aceasta a lucrat pentru mine, fără a instala orice calitate sau a schimba alte setări de sistem.
(Acest lucru a fost deja sugerat într-un comentariu abovedar am vrut să-l dea mai multă importanță, pentru că am ratat-o eu la început.)