Koks geriausias būdas sukurti abėcėlės tvarka surūšiuotą sąrašą programoje "Python"?
Pagrindinis atsakymas:
mylist = ["b", "C", "A"]
mylist.sort()
Tai pakeičia jūsų pradinį sąrašą (t. y. rūšiuoja vietoje). Norėdami gauti surūšiuotą sąrašo kopiją, nekeisdami originalo, naudokite sorted()
funkciją:
for x in sorted(mylist):
print x
Tačiau pirmiau pateikti pavyzdžiai yra šiek tiek naivūs, nes juose neatsižvelgiama į vietinę kalbą ir rūšiuojama pagal didžiąsias raides. Galite pasinaudoti pasirenkamuoju parametru key
ir nurodyti pasirinktinę rūšiavimo tvarką (alternatyva, naudojant cmp
, yra pasenęs sprendimas, nes jį reikia vertinti kelis kartus - key
apskaičiuojamas tik vieną kartą kiekvienam elementui).
Taigi, rūšiuoti pagal dabartinę vietinę kalbą, atsižvelgiant į kalbai būdingas taisykles (cmp_to_key
yra pagalbinė funkcija iš functools):
sorted(mylist, key=cmp_to_key(locale.strcoll))
Ir galiausiai, jei reikia, rūšiavimui galite nurodyti custom locale:
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']
Paskutinė pastaba: pamatysite rūšiavimo be didžiųjų raidžių pavyzdžių, kuriuose naudojamas lower()
metodas - jie yra neteisingi, nes veikia tik ASCII simbolių poaibiui. Šie du metodai neteisingi bet kokiems ne angliškiems duomenims:
# this is incorrect!
mylist.sort(key=lambda x: x.lower())
# alternative notation, a bit faster, but still wrong
mylist.sort(key=str.lower)
Tačiau kaip tai veikia konkrečios kalbos rūšiavimo taisykles? Ar ji atsižvelgia į vietinę kalbą?
Ne, list.sort()
yra bendra rūšiavimo funkcija. Jei norite rūšiuoti pagal Unicode taisykles, turėsite apibrėžti pasirinktinę rūšiavimo rakto funkciją. Galite pabandyti naudoti pyuca modulį, bet nežinau, kiek jis išbaigtas.