Unul dintre aspectele remarcabile ale limbajului Python constă în simplitatea sa. Datorită bibliotecii sale standard, care conține numeroase instrumente utile, lucrul cu Python devine extrem de facil. Un exemplu elocvent este funcția `sorted`.
Această funcție este concepută pentru a aranja elementele unei structuri iterabile într-o anumită ordine. În lipsa ei, ar fi necesară implementarea manuală a algoritmilor de sortare, cum ar fi Bubble Sort sau Insertion Sort, ceea ce poate fi o sarcină complexă. Python, însă, oferă o soluție mai directă și elegantă, pe care o vom explora în acest articol.
Introducere în funcția `sorted`
Funcția `sorted` este un instrument fundamental în Python, destinat aranjării elementelor unei structuri iterabile. O structură iterabilă reprezintă orice colecție de date care poate fi parcursă, cum ar fi șiruri de caractere, liste, tupluri sau seturi. Aceste structuri pot fi, inițial, neordonate, iar funcția `sorted` le organizează valorile conform unei ordini prestabilite. Ordonarea valorilor este esențială din mai multe motive:
- Permite efectuarea căutărilor mai rapide și eficiente, folosind algoritmi precum căutarea binară. Totuși, căutarea binară necesită ca datele să fie deja sortate.
- Facilitează prezentarea informațiilor într-un mod organizat. Adesea, utilizatorii preferă să vizualizeze datele sortate, de exemplu, prețurile de la cel mai mic la cel mai mare sau articolele în ordinea cronologică descendentă. În acest scop, este necesară sortarea listei de valori.
- Sprijină analiza statistică, cum ar fi identificarea valorii care apare cel mai frecvent într-un set de date. Sortarea valorilor simplifică această analiză.
Ghid de utilizare a funcției `sorted`
După cum s-a menționat anterior, funcția `sorted` poate fi aplicată oricărei structuri iterabile. Rezultatul său este o listă, ale cărei elemente sunt aranjate în ordinea specificată. Este important de reținut că, indiferent de tipul structurii iterabile de intrare, rezultatul va fi întotdeauna o listă.
Sintaxa funcției `sorted`
Funcția `sorted` are următoarea structură:
sorted(iterable, key=None, reverse=False)
Singurul argument obligatoriu este `iterable`, adică structura de date care urmează a fi sortată.
Argumentul `key` reprezintă o funcție care transformă fiecare element al structurii iterabile, generând o valoare care va fi utilizată în procesul de sortare. Acest argument este util în special pentru sortarea listelor de dicționare, așa cum vom vedea ulterior. Valoarea implicită este `None`, ceea ce înseamnă că nu se aplică nicio transformare implicită.
Argumentul `reverse` specifică ordinea de sortare. Dacă este setat la `True`, elementele vor fi sortate în ordine inversă.
În secțiunea următoare, vom prezenta exemple practice pentru a ilustra utilizarea funcției.
Exemple de utilizare a funcției `sorted`
Lista numerelor
Cel mai simplu scenariu de sortare este cel al unei liste de numere. Considerați exemplul următor:
# Listă de valori neordonate numbers = [8, 4, 3, 9, 2, 0, 3] # Sortarea numerelor sorted_numbers = sorted(numbers) # Afișarea valorilor sortate print(sorted_numbers)
Rezultatul va fi:
[0, 2, 3, 3, 4, 8, 9]
Valorile au fost aranjate în ordine crescătoare. Pentru a le sorta în ordine descrescătoare, argumentul `reverse` trebuie setat la `True`. Prin urmare, linia 4 din exemplul de cod anterior ar trebui modificată astfel:
sorted_numbers = sorted(numbers, reverse=True)
Rezultatul rulării programului modificat va fi:
[9, 8, 4, 3, 3, 2, 0]
Listă de șiruri
Funcția `sorted` nu se limitează doar la numere; ea poate sorta și șiruri de caractere. În cazul șirurilor dintr-o listă, comparațiile sunt efectuate pe baza primelor caractere ale fiecărui șir, folosind valorile ASCII corespunzătoare. De exemplu, șirul „hello” va fi poziționat înaintea șirului „world”, deoarece valoarea ASCII a lui „h” (104) este mai mică decât cea a lui „w” (119).
Dacă mai multe șiruri încep cu același caracter, se compară caracterele următoare până când se stabilește o ordine. Iată un exemplu în care sortăm o listă de nume:
# Crearea unei liste de nume members_list = ['bob', 'dave', 'charlie', 'alice'] # Sortarea numelor sorted_members_list = sorted(members_list) # Afișarea numelor print(sorted_members_list)
Acesta va produce următoarea ieșire:
['alice', 'bob', 'charlie', 'dave']
Deoarece se utilizează valorile ASCII, ordonarea șirurilor depinde de poziția caracterelor în tabelul ASCII. De exemplu, caracterele cu majuscule vor fi poziționate înaintea celor cu minuscule, deoarece în tabelul ASCII majusculele apar înaintea literelor mici. Iată un tabel ASCII complet pentru referință:
Sursa: commons.wikimedia.org
Alte structuri iterabile – șiruri, tupluri și seturi
După cum am menționat, funcția `sorted` poate fi folosită cu diverse structuri iterabile. Regulile de sortare rămân aceleași. Iată un exemplu:
# Afișarea unui șir sortat print(sorted("dijkstra")) # Afișarea unui tuplu sortat print(sorted((3, 4, 2, 1, 5, 0))) # Afișarea unui set sortat print(sorted(set([4, 5, 5, 1, 3, 8, 9])))
Rezultatul va fi:
['a', 'd', 'i', 'j', 'k', 'r', 's', 't'] [0, 1, 2, 3, 4, 5] [1, 3, 4, 5, 8, 9]
După cum puteți observa, în fiecare caz, rezultatul este o listă.
Lista dicționarelor
Funcția `sorted` poate fi utilizată și pentru sortarea listelor de dicționare. Însă, sortarea dicționarelor este puțin mai complexă, deoarece, spre deosebire de numere sau șiruri, un dicționar poate avea mai multe proprietăți, fiecare putând fi folosită ca bază de comparație.
Pentru a sorta dicționarele, este necesar să specificăm o funcție care transformă fiecare dicționar într-o valoare unică, care va fi folosită pentru comparație. Această funcție este transmisă funcției `sorted` ca argument `key`. Iată un exemplu pentru a clarifica:
people = [ { 'name': 'Alice', 'age': 27 }, { 'name': 'Bob', 'age': 23 }, { 'name': 'Charlie', 'age': 25} ] people_sorted_by_age = sorted(people, key=lambda person: person['age']) print(people_sorted_by_age)
În acest exemplu, avem trei persoane, fiecare reprezentată de un dicționar cu proprietăți precum numele și vârsta. Dorim să sortăm persoanele în funcție de vârstă. Prin urmare, transmitem funcției `sorted` o funcție care primește dicționarul unei persoane și returnează vârsta acesteia.
Această valoare returnată este folosită în comparație. În acest mod, întregul dicționar este redus la un număr întreg simplu. Pentru simplitate, am utilizat o funcție lambda pentru a defini argumentul `key`.
Rularea codului va produce următorul rezultat:
[{'name': 'Bob', 'age': 23}, {'name': 'Charlie', 'age': 25}, {'name': 'Alice', 'age': 27}]
Cazul de utilizare a argumentului `key`
Argumentul `key` nu este util doar în sortarea dicționarelor, ci și în orice situație în care este necesară o transformare a valorilor înainte de sortare. Iată câteva exemple de utilizare:
- Sortarea valorilor în funcție de lungimea lor, prin definirea unei funcții `key` care returnează lungimea valorii.
- Sortarea șirurilor dintr-o listă, ignorând diferențele dintre majuscule și minuscule, prin transformarea fiecărui șir în litere mici cu ajutorul unei funcții `key`.
- Sortarea valorilor pe baza unei valori compuse, care combină informații din alte câmpuri.
Complexitatea timpului de rulare a funcției `sorted`
Funcția `sorted` are o complexitate de rulare de O(n log n), unde n este numărul de elemente din structura iterabilă de intrare. Această complexitate este determinată de algoritmul Timsort, utilizat de funcție, un algoritm de sortare hibrid bazat pe îmbinare și inserție.
Complexitatea spațială a funcției este O(n), unde n este numărul de elemente din intrare, deoarece este creată și returnată o listă nouă.
Funcția `sorted` vs. Funcția `sort`
O altă opțiune pentru sortarea valorilor este funcția `sort`. Această secțiune va evidenția diferențele majore dintre funcțiile `sorted` și `sort`.
- Funcția `sort` modifică lista originală în loc, în timp ce `sorted` creează o listă nouă.
- Deoarece modificările sunt efectuate în loc, funcția `sort` are ca intrare o listă. Funcția `sorted`, pe de altă parte, poate accepta orice tip de structură iterabilă ca intrare, generând apoi o nouă listă care va fi returnată.
Cuvinte finale
În acest articol, am analizat funcția `sorted`: ce este, cum se utilizează și diferitele argumente pe care le primește. Am explorat diverse exemple de utilizare, complexitatea sa de rulare și am comparat-o cu funcția `sort`.
În continuare, vă recomandăm să citiți articolul nostru despre funcția `sum` din Python.