Lajittele luettelo Pythonissa

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 None

Menetelmä 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, ohitakey=(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, mieluumminsorted().

Näiden kuvioiden avulla voit lajitella mitä tahansa iteroitavissa olevaa ennustettavissa olevaa - numbers, tekstiä, tupleja tai esineitä - hallitsemalla kriteerejä ja järjestystä minimaalisella koodilla.

Related Posts