Jedna od značajnih prednosti korišćenja programskog jezika Python jeste njegova jednostavnost. Lako se koristi jer njegova standardna biblioteka sadrži mnoge korisne funkcije. Jedna od takvih funkcija je `sorted` funkcija.
Ova funkcija služi za sortiranje iterabilnih objekata po određenom redosledu. Bez nje, bilo bi neophodno ručno pisati kod koji implementira algoritme za sortiranje, kao što su Bubble Sort ili Insertion Sort. Ovo često može biti komplikovano, ali Python nudi jednostavnije rešenje koje ćemo detaljno razmotriti u ovom članku.
Uvod u `sorted` funkciju
`sorted` funkcija je ugrađena funkcija u Pythonu koja omogućava sortiranje iterabilnih objekata. Iterabilni objekat je svaki objekat kroz koji se može iterirati, odnosno prolaziti kroz njegove elemente pomoću petlje. Primeri iterabilnih objekata uključuju stringove, liste, torke i skupove. Ovi objekti su često neuređeni, a proces sortiranja postavlja njihove vrednosti u definisan redosled. Redosled vrednosti je koristan jer:
- Omogućava bržu i efikasniju pretragu vrednosti koristeći algoritme kao što je binarna pretraga. Međutim, binarna pretraga zahteva da vrednosti budu prethodno sortirane.
- Pomaže pri prikazu vrednosti. Ponekad korisnici žele da vide informacije sortirane po određenom kriterijumu, na primer, od najniže do najviše cene ili od najnovije do najstarije objave. Ovo bi zahtevalo implementaciju nekog načina sortiranja liste vrednosti.
- Olakšava statističku analizu, na primer, pronalaženje najčešće pojavljene vrednosti u skupu. Lakše je to uraditi kada su vrednosti sortirane po redu.
Vodič za korišćenje `sorted` funkcije
Kao što je već pomenuto, `sorted` funkcija radi sa svim iterabilnim objektima. Ona vraća novu listu koja je sortirana. Važno je zapamtiti da, iako ulaz može biti bilo koji iterabilni objekat, povratna vrednost je uvek lista.
Sintaksa `sorted` funkcije
Potpis `sorted` funkcije je sledeći:
sorted(iterable, key=None, reverse=False)
Kao što vidite, jedini obavezan argument je `iterable`, koji predstavlja objekat koji se sortira.
Sledeći argument je `key`. `key` je funkcija koja se primenjuje na svaki element iterabilnog objekta kako bi se dobila vrednost koja se koristi za sortiranje. Ovo je posebno korisno za sortiranje lista rečnika, kao što ćemo videti kasnije. Podrazumevana vrednost je `None`, što znači da se neće primeniti nikakva funkcija ukoliko nije navedena.
Poslednji argument je `reverse`. Kada je postavljen na `True`, stavke će biti sortirane u obrnutom redosledu.
U nastavku ćemo koristiti primere da ilustrujemo upotrebu funkcije.
Primeri upotrebe `sorted` funkcije
Lista brojeva
Najjednostavniji slučaj sortiranja je sortiranje liste brojeva. Razmotrimo sledeći primer:
# Lista nesortiranih vrednosti numbers = [8, 4, 3, 9, 2, 0, 3] # Sortiranje brojeva sorted_numbers = sorted(numbers) # Ispisivanje sortiranih vrednosti print(sorted_numbers)
Izlaz bi bio:
[0, 2, 3, 3, 4, 8, 9]
Kao što vidite, vrednosti su sortirane u rastućem redosledu. Ako želite da ih sortirate u opadajućem redosledu, postavili biste `reverse` na `True`. Stoga bi red broj 4 u prethodnom primeru koda bio:
sorted_numbers = sorted(numbers, reverse=True)
Rezultat pokretanja izmenjenog programa bi bio:
[9, 8, 4, 3, 3, 2, 0]
Lista stringova
`sorted` funkcija podržava sortiranje i stringova. Prilikom sortiranja liste stringova, porede se prvi karakteri svakog stringa. Poređenja se vrše na osnovu ASCII vrednosti karaktera. Na primer, „zdravo“ bi bilo ispred „svet“ jer je ASCII vrednost karaktera „z“ (122) manja od ASCII vrednosti karaktera „s“ (115).
Ako dva ili više stringova imaju isti prvi karakter, onda se porede drugi karakteri, i tako dalje, dok se ne utvrdi redosled. Evo primera sortiranja liste imena ljudi:
# Kreiranje liste imena members_list = ['bob', 'dave', 'charlie', 'alice'] # Sortiranje imena sorted_members_list = sorted(members_list) # Ispisivanje imena print(sorted_members_list)
Ovo će proizvesti sledeći izlaz:
['alice', 'bob', 'charlie', 'dave']
Pošto se koriste ASCII vrednosti, redosled stringova zavisi od toga koji karakter se prvi pojavljuje u ASCII tabeli. Na primer, veliko slovo bi dolazilo pre malog, jer se velika slova nalaze pre malih slova u ASCII tabeli. Evo kompletne ASCII tabele:
Izvor: commons.wikimedia.org
Drugi iterabilni objekti – stringovi, torke i skupovi
Kao što je pomenuto, `sorted` funkcija radi sa svim tipovima iterabilnih objekata. Ista pravila važe za način na koji će vrednosti u iterabilnim objektima biti sortirane. Evo nekoliko primera:
# Ispisivanje sortiranog stringa print(sorted("dijkstra")) # Ispisivanje sortirane torke vrednosti print(sorted((3, 4, 2, 1, 5, 0))) # Ispisivanje sortiranog skupa vrednosti print(sorted(set([4, 5, 5, 1, 3, 8, 9])))
Rezultat ovoga će biti:
['a', 'd', 'i', 'j', 'k', 'r', 's', 't'] [0, 1, 2, 3, 4, 5] [1, 3, 4, 5, 8, 9]
Kao što vidite, izlaz u svakom slučaju je lista.
Lista rečnika
Takođe možete primeniti `sorted` funkciju za sortiranje liste rečnika. Međutim, sortiranje rečnika je malo složenije. To je zato što, za razliku od brojeva ili stringova, rečnik ima više svojstava, od kojih je svako podjednako validno za poređenje.
Dakle, da biste sortirali rečnike, morate navesti funkciju koja će sumirati ceo rečnik na jednu vrednost koja će se koristiti za poređenje. Ova funkcija se prosleđuje `sorted` funkciji kao argument `key`. Evo primera za ilustraciju:
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)
U ovom primeru imamo tri osobe predstavljene objektima rečnika. Svaki objekat ima atribut `name` i `age`. Želimo da sortiramo osobe po godinama. Prema tome, kada pozovemo `sorted` funkciju, prosleđujemo funkciju kao argument `key`.
Ova funkcija uzima objekat rečnika osobe i vraća godine osobe. Povratna vrednost ovog `key`-a se koristi za sortiranje. Dakle, ceo rečnik je sveden na jednostavan ceo broj koji se može porediti. Radi jednostavnosti, koristili smo lambda funkciju za definisanje argumenta `key`.
Pokretanje ovog koda će proizvesti sledeći izlaz:
[{'name': 'Bob', 'age': 23}, {'name': 'Charlie', 'age': 25}, {'name': 'Alice', 'age': 27}]
Slučajevi upotrebe argumenta `key`
Argument `key` se ne mora koristiti samo pri sortiranju rečnika. Možete ga koristiti za sve vrednosti. Njegova svrha je da obezbedi ključ koji se koristi za sortiranje vrednosti. Evo nekoliko primera:
- Sortiranje vrednosti prema dužini, definisanjem funkcije `key` koja uzima vrednost i vraća njenu dužinu.
- Sortiranje stringova u listi na način koji nije osetljiv na velika i mala slova. Da biste to uradili, svaki string u listi se može konvertovati u mala slova. Ovo se može postići definisanjem funkcije `key` koja uzima string kao ulaz i vraća njegovu verziju sa malim slovima.
- Sortiranje vrednosti na osnovu složene vrednosti koja kombinuje vrednosti drugih unosa.
Vremenska složenost `sorted` funkcije
`sorted` funkcija ima vremensku složenost od O(n log n), gde je n broj elemenata u iterabilnom ulazu. Ova složenost proizilazi iz činjenice da funkcija koristi Timsort algoritam, koji je hibridni algoritam sortiranja baziran na merge sortu i insertion sortu.
Prostorna složenost funkcije je O(n), gde je n broj elemenata u ulazu. To je zato što se kreira i vraća nova lista.
`sorted` funkcija naspram `sort` metode
Druga opcija za sortiranje vrednosti je metoda `sort`. U ovom odeljku će biti objašnjene ključne razlike između `sorted` funkcije i `sort` metode.
- `sort` metoda modifikuje iterabilni objekat na licu mesta, dok `sorted` funkcija kreira novu listu i vraća je.
- Pošto se modifikacije vrše na licu mesta, `sort` metoda zahteva da ulaz bude lista. S druge strane, `sorted` može uzeti bilo koji iterabilni objekat kao ulaz, koji će se zatim koristiti za kreiranje nove liste koja će biti modifikovana i vraćena.
Završne reči
U ovom članku smo pokrili `sorted` funkciju – šta je ona, kako se koristi, i različite argumente koje prima. Takođe smo razmotrili različite primere upotrebe funkcije, njenu vremensku i prostornu složenost, i uporedili je sa `sort` metodom.
Možda biste želeli da pročitate naš članak o Python-ovoj funkciji `sum`.