Treci la conținutul principal

Ordonarea unei colecții

Sortarea înseamnă aranjarea elementelor unei colecții într-o anumită ordine.

Unele tipuri au o ordine naturală. Numerele sunt ordonate după valoare: 1 vine înaintea lui 2. Șirurile sunt ordonate alfabetic: "four" vine înaintea lui "one". Pentru orice altceva, sau când vrei o altă ordine, dai o ordine personalizată cu o funcție cheie: o funcție care transformă un element în valoarea după care trebuie sortat.

Python sortează listele în două moduri:

  • sorted(s) returnează o listă nouă sortată și lasă originalul neschimbat. Funcționează pe orice iterabil.
  • s.sort() sortează lista pe loc: ordinea inițială se pierde.

Ambele primesc aceleași două argumente cu nume: key= (funcția cheie) și reverse=True pentru ordine descrescătoare. Multe limbaje sortează cu o funcție de comparare care se uită la două elemente; Python cere în schimb o cheie pentru un singur element și compară cheile. Aproape orice funcție de comparare pe care ai scrie-o devine o funcție cheie mai scurtă, de exemplu key=len pentru a sorta după lungime.

Exemplele de mai jos folosesc cuvintele one, two, three, four.


Ordinea naturală

Ordinea naturală este ordinea pe care un tip o are de la sine: numerele după valoare, șirurile literă cu literă.

sorted(words) dă o listă nouă în ordine naturală. Pentru ordine descrescătoare nu sortezi de două ori: transmite reverse=True și lista nouă iese inversată.

Și tuplurile au o ordine naturală: Python le compară poziție cu poziție, iar prima diferență decide. Astfel, propriile tale date primesc o ordine fără efort. Un număr de versiune stocat ca tuplul (major, minor) este comparat întâi după major și doar când valorile major sunt egale decide minor — exact comparația reutilizabilă pe care altfel ai scrie-o de mână.

Copie sortată

sorted() creează o listă nouă, sortată alfabetic. Lista originală words este afișată după aceea pentru a arăta că nu s-a schimbat.

Prompt
Ia cuvintele one, two, three, four. Creează o listă nouă sortată în ordinea naturală (alfabetică) cu sorted(), astfel încât lista originală să nu se schimbe. Afișează lista sortată, apoi afișează lista originală.
Ieșire: program Python complet
Sorted copy

Sortare descrescătoare

reverse=True face ca sorted() să returneze lista nouă în ordine descrescătoare, astfel încât cuvintele merg de la "two" până la "four".

Prompt
Ia cuvintele one, two, three, four. Folosește sorted() cu reverse=True pentru a obține o listă nouă în ordine alfabetică descrescătoare. Afișează rezultatul.
Ieșire: program Python complet
Sorted descending

Un tip cu propria ordine

O versiune este tuplul (major, minor). Compararea tuplurilor se uită întâi la major; doar când valorile major sunt egale decide minor. (1, 2) > (1, 3) întreabă „este versiunea 1.2 mai mare decât 1.3?” și afișează False; (2, 0) > (1, 5) afișează True.

Prompt
Stochează numerele de versiune ca tupluri (major, minor). Folosind compararea naturală a tuplurilor, afișează dacă versiunea 1.2 este mai mare decât 1.3, apoi dacă 2.0 este mai mare decât 1.5.
Ieșire: program Python complet
A type with its own order

Ordini personalizate

O ordine personalizată este orice ordine pe care o descrii cu o funcție cheie.

Transmite-o ca key=: Python apelează funcția o dată pentru fiecare element și sortează elementele după ce returnează ea. Sortarea din Python este stabilă: elementele cu chei egale își păstrează întotdeauna ordinea inițială. Nu ai nevoie niciodată de o sortare stabilă separată, de exemplu când sortezi cuvinte după lungime.

Sortarea după o singură proprietate a fiecărui element este cazul obișnuit: key=len sortează după lungime, iar o lambda extrage orice altceva, cum ar fi ultima literă a unui cuvânt.

Pentru ordine descrescătoare adaugă reverse=True. Acesta inversează compararea cheilor, iar elementele egale își păstrează în continuare ordinea inițială.

Pentru a sorta după un criteriu și apoi după altul, returnează un tuplu din funcția cheie. Tuplurile se compară poziție cu poziție, așa că a doua valoare departajează egalitatea atunci când prima spune că elementele sunt egale.

Sortare cu o funcție cheie

key=len dă fiecărui cuvânt lungimea sa drept cheie: 3 pentru "aaa", 2 pentru "bb", 1 pentru "c". Cheia cea mai mică vine prima, așa că cuvintele ajung ordonate de la cel mai scurt la cel mai lung. words.sort() face asta pe loc.

Prompt
Ia cuvintele aaa, bb, c. Sortează lista pe loc cu words.sort(key=len), astfel încât cuvintele mai scurte să fie primele. Afișează rezultatul.
Ieșire: program Python complet
Sort with a key function

Sortare după lungime

Cuvintele sunt sortate cu key=len. "one" și "two" au amândouă 3 litere; sortarea stabilă păstrează "one" înaintea lui "two".

Prompt
Ia cuvintele one, two, three, four. Sortează-le după lungime cu sorted() și key=len, astfel încât cuvintele de aceeași lungime să își păstreze ordinea inițială. Afișează rezultatul.
Ieșire: program Python complet
Sort by length

Sortare după ultima literă, descrescător

w[-1] este ultima literă a unui cuvânt. Cu reverse=True, cuvântul cu cea mai mare ultimă literă vine primul: "four" (r), apoi "two" (o), apoi cele două cuvinte care se termină în „e”, în ordinea lor inițială.

Prompt
Ia cuvintele one, two, three, four. Sortează-le după ultima literă, în ordine descrescătoare: folosește sorted() cu key=lambda w: w[-1] și reverse=True. Afișează rezultatul.
Ieșire: program Python complet
Sort by last letter, descending

Sortare după lungime, apoi alfabetic

Cheia (len(w), w) este un tuplu: întâi lungimea. Când două cuvinte au aceeași lungime, a doua valoare — cuvântul însuși — le ordonează alfabetic.

Prompt
Ia cuvintele aaa, bb, c, b, a, aa, ccc. Sortează-le mai întâi după lungime și apoi alfabetic, folosind sorted() cu cheia tuplu (len(w), w). Afișează rezultatul.
Ieșire: program Python complet
Sort by length, then alphabetically

Verificarea ordinii sortate

Uneori vrei doar să afli dacă o listă este deja sortată, fără să o sortezi.

Python nu are o funcție is_sorted(), dar verificarea încape pe un rând: fiecare element trebuie să fie mai mic sau egal cu vecinul său din dreapta. zip(s, s[1:]) grupează fiecare element cu următorul, iar all() confirmă că fiecare pereche este în ordine. Pentru ordine descrescătoare, inversează comparația: a >= b în loc de a <= b.

Pentru a verifica ordinea unei singure proprietăți, cum ar fi vârsta unui utilizator, compară acea proprietate în interiorul verificării.

Verificare crescătoare și descrescătoare

all(a <= b ...) confirmă că 1, 2, 3, 4 sunt în ordine crescătoare. Comparația inversată a >= b confirmă că 4, 3, 2, 1 sunt în ordine descrescătoare.

Prompt
Verifică dacă numerele 1, 2, 3, 4 sunt în ordine crescătoare cu all() pe zip(ascending, ascending[1:]) și afișează răspunsul. Apoi verifică dacă 4, 3, 2, 1 sunt în ordine descrescătoare cu comparația inversată a >= b și afișează și acest răspuns.
Ieșire: program Python complet
Ascending and descending check

Verificarea ordinii după un câmp

Utilizatorii sunt Alice (24), Bob (31) și Charlie (29). Verificarea se uită doar la vârste. Bob este mai în vârstă decât Charlie, așa că lista nu este sortată după vârstă, iar programul afișează False.

Prompt
Creează o listă de tupluri (name, age) cu Alice 24, Bob 31 și Charlie 29. Extrage vârstele și folosește all() pe perechile de vecini pentru a verifica dacă utilizatorii sunt sortați după vârstă, apoi afișează răspunsul.
Ieșire: program Python complet
Check order by a field

Ordinea inversă

Inversarea pune ultimul element primul și primul element ultimul.

Slice-ul words[::-1] construiește o copie inversată: originalul își păstrează ordinea. words.reverse(), în schimb, inversează lista pe loc. Există și funcția încorporată reversed(words): ea returnează un iterator care parcurge lista de la coadă la cap fără să construiască una nouă — învelește-l în list() când ai nevoie de o listă reală.

Copie inversată

Copia creată de words[::-1] este afișată, apoi este afișat originalul pentru a arăta că nu s-a schimbat.

Prompt
Ia cuvintele one, two, three, four. Construiește o copie inversată cu slice-ul words[::-1], astfel încât originalul să rămână neschimbat. Afișează copia inversată, apoi afișează originalul.
Ieșire: program Python complet
Reversed copy

Ordinea aleatorie

Amestecarea pune elementele într-o ordine aleatorie.

Modulul random are o funcție shuffle(). La fel ca words.reverse(), lucrează pe loc, așa că amestecă o copie făcută cu words[:] dacă mai ai nevoie de original.

Un obiect random.Random(seed) cu un seed fix dă aceeași ordine „aleatorie” de fiecare dată când programul rulează cu acel seed. Acest lucru este util pentru teste și pentru exemple ca acesta. Funcția random.shuffle() de la nivelul modulului nu are un seed fix, așa că ordinea se schimbă la fiecare rulare.

Copie amestecată

Un obiect random.Random cu seed-ul 25 amestecă o copie a cuvintelor. Cu acest seed, rezultatul este ['two', 'three', 'one', 'four'] la fiecare rulare.

Prompt
Ia cuvintele one, two, three, four. Creează un obiect random.Random cu seed-ul 25. Amestecă o copie a listei, făcută cu words[:], folosind metoda shuffle() a obiectului. Afișează copia amestecată.
Ieșire: program Python complet
Shuffled copy