Käytä Pythonin sisäänrakennettuja lajittelutyökaluja tietojen järjestämiseen deterministisesti. Viralliset lajittelutekniikat opas kattaa kaksi ydinsovellusta -sorted()jalist.sort()- mukaan lukien mukautetut avaimet, laskeva järjestys ja vakaus takaavat, että säilyttävät yhtäläisten esineiden järjestyksen. Katso dokumentaatio osoitteessa docs.python.org. Paikka-menetelmän viite, katso List.Sort ().
Menetelmä 1: Luo uusi lajiteltu luettelosorted()
Vaihe 1:Soittaasorted(iterable)lajitella ja palauttaa uusi luettelo.
nums = [5, 2, 9, 1]
sorted_nums = sorted(nums)
print(sorted_nums) # [1, 2, 5, 9]Vaihe 2:Varmista, että alkuperäinen sekvenssi pysyy muuttumattomana.
print(nums) # [5, 2, 9, 1]Vaihe 3:Lisätäreverse=Truelajitella laskevassa järjestyksessä.
sorted_desc = sorted(nums, reverse=True)
print(sorted_desc) # [9, 5, 2, 1]Menetelmä 2: Lajittele luettelo paikoillaanlist.sort()
Vaihe 1:Soittaayour_list.sort()Järjestää luettelo paikoilleen.
a = [5, 2, 9, 1]
a.sort()
print(a) # [1, 2, 5, 9]Vaihe 2:Käyttääreverse=Truelajitella laskeva.
a.sort(reverse=True)
print(a) # [9, 5, 2, 1]Vaihe 3:Soittaasort()määrittämättä sen palautusarvoa (se palaaNone).
a = [3, 1, 2]
a.sort() # correct
# a = a.sort() # incorrect: a becomes NoneMenetelmä 3: Käytä mukautettuja kriteerejäkey=parametri
Vaihe 1:Lajittele jouset koteloiden herkkä siirtämällä normalisointifunktio avaimena.
words = "This is a Test from Python".split()
ci = sorted(words, key=str.casefold)
print(ci) # ['a', 'from', 'is', 'Python', 'Test', 'This']Vaihe 2:Lajittele tuples tietyn kentän mukaan käyttämälläoperator.itemgetter.
from operator import itemgetter
student_tuples = [
('john', 'A', 15),
('jane', 'B', 12),
('dave', 'B', 10),
]
by_age = sorted(student_tuples, key=itemgetter(2))
print(by_age) # [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]Vaihe 3:Lajittele objektit määritteellä käyttämälläoperator.attrgetter.
from operator import attrgetter
class Student:
def __init__(self, name, grade, age):
self.name, self.grade, self.age = name, grade, age
def __repr__(self):
return repr((self.name, self.grade, self.age))
students = [
Student('john', 'A', 15),
Student('jane', 'B', 12),
Student('dave', 'B', 10),
]
by_age = sorted(students, key=attrgetter('age'))
print(by_age) # [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]Vaihe 4:Lajittele absoluuttisen arvon mukaankey=abs(valinnaisesti laskevareverse=True).
vals = [1, -5, 10, 6, 3, -4, -9]
by_abs_desc = sorted(vals, key=abs, reverse=True)
print(by_abs_desc) # [10, -9, 6, -5, -4, 3, 1]Menetelmä 4: Moni-avain ja vakaa lajittelu
Vaihe 1:Lajittele useiden kenttien mukaan yhdessä passissa siirtämällä useita näppäimiäitemgettertaiattrgetter.
from operator import itemgetter
gradebook = [
('john', 'A', 15),
('dave', 'B', 10),
('jane', 'B', 12),
]
by_grade_then_age = sorted(gradebook, key=itemgetter(1, 2))
print(by_grade_then_age)
# [('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)]Vaihe 2:Käytä kahta siirtoa sekoittamaan nousevia ja laskevia tilauksia; Pythonin lajittelu on vakaa, joten ensimmäinen järjestys säilyy yhtä suurissa näppäimissä.
from operator import attrgetter
class S:
def __init__(self, name, grade, age):
self.name, self.grade, self.age = name, grade, age
def __repr__(self): return repr((self.name, self.grade, self.age))
data = [S('john', 'A', 15), S('jane', 'B', 12), S('dave', 'B', 10)]
# First: secondary key (age ascending)
tmp = sorted(data, key=attrgetter('age'))
# Second: primary key (grade descending)
result = sorted(tmp, key=attrgetter('grade'), reverse=True)
print(result)
# [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]Vinkkejä, suorituskykyä ja yleisiä sudenkuoppia
Molemmatsorted()jalist.sort()Käytä Timsortia, joka on stabiili ja optimoitu osittain tilattuihin tietoihin ja suoritetaan tyypillisesti O (n log n) -aikana. Sekey=Toiminto arvioidaan kerran elementtiä kohti, sitten vertailut käyttävät laskettuja näppäimiä. Syvempää taustaa stabiilisuudesta, monipäästöistä ja vertailu-funktiosovittimista, katso yllä linkitetyt Python-asiakirjat.
Lisää lukemista:Kuinka käyttää // Pythonissa lattiajakoon
- Tarvitseeko pitää alkuperäiset tiedot? Käyttää
sorted(), joka palauttaa uuden luettelon. - Haluatko nopeimman polun luettelolle, jonka aiot mutatata? Käyttää
list.sort()lajitella paikalleen. - Älä määritä
a = a.sort(); se palaaNone. - Mukautettu tilaus, ohita
key=(esim,key=str.casefold-key=itemgetter(...)-key=attrgetter(...)). - Käyttää
reverse=Truelaskevalle järjestykselle; Lajitteluvakaus säilyy. - Kun muisti on tiukka, mieluummin lajittelu; Kun tarvitset alkuperäistä tilausta muualla, mieluummin
sorted().
Näiden kuvioiden avulla voit lajitella mitä tahansa iteroitavissa olevaa ennustettavissa olevaa - numbers, tekstiä, tupleja tai esineitä - hallitsemalla kriteerejä ja järjestystä minimaalisella koodilla.














