U ovom uputstvu, istražićemo različite tehnike za pronalaženje pozicije (indeksa) određenog elementa unutar Python liste. Koristićemo jednostavne petlje, kao i ugrađenu metodu index()
.
Često, kada radimo sa Python listama, potrebno je da lociramo gde se tačno nalazi određeni član. To možemo postići na dva osnovna načina:
- Prolaskom kroz listu i upoređivanjem svakog elementa sa traženom vrednošću.
- Korišćenjem ugrađene metode
index()
.
Obe metode ćemo detaljno obraditi u ovom vodiču. Hajde da počnemo! 👩🏽💻
Python liste: kratak pregled
U Python-u, lista je uređena kolekcija elemenata, koji mogu biti istog ili različitog tipa podataka. Liste su promenljive, što znači da se mogu modifikovati na licu mesta, bez potrebe za kreiranjem nove liste.
Pogledajmo primer liste voća, koja sadrži pet različitih vrsta:
fruits = ["apple","mango","strawberry","pomegranate","melon"]
Dužinu bilo kog Python objekta možemo odrediti pomoću ugrađene funkcije len()
. Dakle, pozivanjem funkcije len()
sa listom (fruits
) kao argumentom, dobijamo njenu dužinu:
len(fruits) # Izlaz: 5
U ovom uputstvu, koristićemo listu voća kao praktičan primer.
Indeksiranje u Python listama
Python koristi nulto indeksiranje. To znači da je prvi element u bilo kom Python iterabilnom objektu na indeksu 0, drugi na indeksu 1, i tako dalje. Ako je dužina iterabilnog objekta k, poslednji element se nalazi na indeksu k – 1.
Funkcija range()
u Python-u omogućava generisanje indeksa prilikom prolaska kroz iterabilne objekte.
Važno: Kada generišemo opseg pomoću range(k)
, dobijamo indekse 0, 1, 2, …, (k-1). Dakle, ako postavimo k = len(lista)
, dobićemo sve validne indekse te liste.
Sledeći primer demonstrira ovo:
for i in range(len(fruits)): print(f"i:{i}, fruit[{i}] is {fruits[i]}") # Izlaz i:0, fruit[0] is apple i:1, fruit[1] is mango i:2, fruit[2] is strawberry i:3, fruit[3] is pomegranate i:4, fruit[4] is melon
Sada kada smo razjasnili osnove Python lista, hajde da istražimo kako pronaći indeks određenog elementa.
Pronalaženje indeksa elementa liste iteracijom pomoću for
petlje
Nastavićemo da koristimo listu voća iz prethodnog odeljka. Pokazaćemo kako da pronađemo indeks određene stavke u listi pomoću for
petlje.
Korišćenje for
petlje i range()
funkcije
Definišimo cilj: vrednost koju tražimo unutar liste.
Možemo koristiti for
petlju i range()
funkciju da generišemo listu indeksa od 0 do len(fruits)
– 1.
- Prolazimo kroz listu voća pristupajući svakom indeksu.
- Proveravamo da li je element na trenutnom indeksu
i
jednak ciljnoj vrednosti.
- Ako je uslov ispunjen, ispisujemo da je ciljna vrednost pronađena na indeksu
i
.
fruits = ["apple","mango","strawberry","pomegranate","melon"] target = "mango" for i in range(len(fruits)): if fruits[i] == target: print(f"{target} found at index {i}") # Izlaz mango found at index 1
U ovom primeru, ciljna reč ‘mango’ se pojavljuje samo jednom (na indeksu 1) u listi voća.
Međutim, dešava se da se ciljna vrednost pojavljuje više puta ili se uopšte ne pojavljuje. Da bismo rešili takve slučajeve, modifikovaćemo gornju petlju i postaviti je unutar funkcije pod nazivom find_in_list
.
Razumevanje definicije funkcije
Funkcija find_in_list
ima dva parametra:
target
: vrednost koju tražimo.py_list
: Python lista kroz koju pretražujemo.
def find_in_list(target,py_list): target_indices = [] for i in range(len(fruits)): if fruits[i] == target: target_indices.append(i) if target_indices == []: print("Sorry, target not found!") else: print(f"{target} is found at indices {target_indices}")
Unutar tela funkcije, prvo kreiramo praznu listu target_indices
. Prolazimo kroz listu i pristupamo svakom elementu. Ako pronađemo ciljnu vrednost na određenom indeksu, dodajemo taj indeks u listu target_indices
pomoću metode append()
.
Napomena: U Python-u, list.append(element)
dodaje element na kraj liste.
- Ako ciljna vrednost nikada nije pronađena,
target_indices
ostaje prazna lista, i korisnik se obaveštava da tražena vrednost ne postoji u listi. - Ako se ciljna vrednost nalazi na više indeksa,
target_indices
će sadržati sve te indekse.
Sada, predefinišimo listu voća kao što je prikazano.
Ovog puta, tražimo ciljnu reč ‘mango’, koja se pojavljuje dva puta – na indeksima 1 i 4.
fruits = ["apple","mango","strawberry","pomegranate","mango","melon"] target = "mango" find_in_list(target,fruits) # Izlaz mango is found at indices [1, 4]
Kada pozovemo funkciju find_in_list
sa argumentima target
i fruits
, dobijamo oba indeksa.
target = "turnip" find_in_list(target,fruits) # Izlaz Sorry, target not found!
Ako pokušamo da potražimo ‘turnip’ (repa) koja ne postoji u listi voća, dobićemo poruku da cilj nije pronađen.
Korišćenje for
petlje i enumerate()
funkcije
U Python-u, možemo koristiti funkciju enumerate()
da istovremeno pristupimo i indeksu i elementima liste – bez potrebe za korišćenjem range()
funkcije.
Sledeći kod pokazuje kako se enumerate()
može iskoristiti za dobijanje indeksa i elemenata:
fruits = ["apple","mango","strawberry","pomegranate","mango","melon"] for index,fruit in enumerate(fruits): print(f"Index {index}: {fruit}") # Izlaz Index 0: apple Index 1: mango Index 2: strawberry Index 3: pomegranate Index 4: mango Index 5: melon
Sada, prepisaćemo Python funkciju za pronalaženje indeksa elemenata u listi koristeći enumerate()
funkciju:
def find_in_list(target,py_list): target_indices = [] for index, fruit in enumerate(fruits): if fruit == target: target_indices.append(index) if target_indices == []: print("Sorry, target not found!") else: print(f"{target} is found at indices {target_indices}")
Kao i u prethodnom odeljku, sada možemo pozvati funkciju find_in_list
sa validnim argumentima.
Gornju definiciju funkcije možemo prevesti u ekvivalentan izraz pomoću list comprehension, što ćemo uraditi u narednom odeljku.
Pronalaženje indeksa elemenata u listi pomoću list comprehension
List comprehension u Python-u omogućava kreiranje novih lista iz postojećih, na osnovu određenih uslova. Opšta sintaksa je:
new_list = [<izlaz> for <elementi u postojećim iterabilnim objektima> if <uslov je ispunjen>]
Slika ispod ilustruje elemente list comprehension-a. Koristeći ovo, možemo pretvoriti funkciju find_in_list
u list comprehension.
Na osnovu navedenog, izraz list comprehension-a za kreiranje ciljnih indeksa izgleda ovako:
target_indices = [index for index,fruit in enumerate(fruits) if fruit==target]
Kao vežbu, možete isprobati gornji kod sa različitim primerima.
Pronalaženje indeksa elementa liste pomoću metode index()
Za pronalaženje indeksa elementa u Python listi, možemo koristiti ugrađenu metodu .index()
. Opšta sintaksa je:
list.index(value,start,end)
Objašnjenje gornje metode:
value
je ciljna vrednost koju tražimo.start
iend
su opcionni pozicioni argumenti; mogu se koristiti za pretragu indeksa elementa u određenom delu liste, počevši odstart
i završavajući se saend
– 1.
Važno: Metoda .index()
vraća samo indeks prvog pojavljivanja date vrednosti u listi. Čak i kada pretražujemo samo deo liste [start: end-1]
, ova metoda vraća samo indeks koji odgovara prvom pojavljivanju elementa.
Pogledajmo ponovo naš primer da bismo bolje razumeli kako .index()
funkcioniše.
fruits = ["apple","mango","strawberry","pomegranate","mango","melon"] target = "mango" fruits.index(target) 1
Iako se ‘mango’ pojavljuje dva puta u listi voća, vraćen je samo indeks prvog pojavljivanja.
Da bismo dobili indeks drugog pojavljivanja ‘mango’, možemo pretraživati deo liste počevši od indeksa 2 i završavajući sa indeksom 5, kao što je prikazano ispod.
fruits.index(target,2,5) 4
Kako rukovati greškama tipa ValueError
u Python-u
Hajde da vidimo šta se dešava ako pokušamo da pronađemo indeks elementa koji ne postoji u listi, recimo ‘carrot’ (šargarepa).
target = "carrot" fruits.index(target) # Izlaz --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-17-81bd454e44f7> in <module>() 1 target = "carrot" 2 ----> 3 fruits.index(target) ValueError: 'carrot' is not in list
Kao što se vidi u gornjem primeru, ovo generiše ValueError
. U Python-u, ovakvu grešku možemo obraditi kao izuzetak korišćenjem try
i except
blokova.
Opšta sintaksa za korišćenje try-except
blokova je:
try: # pokušaj ovo except <ErrorType>: # uradi ovo za obradu <ErrorType> kao izuzetak
Koristeći try-except
blokove, možemo obraditi ValueError
kao izuzetak.
target = "carrot" try: fruits.index(target) except ValueError: print(f"Sorry, could not find {target} in list") # Izlaz Sorry, could not find carrot in list
Gornji kod radi sledeće:
- Ako je ciljna vrednost prisutna u listi, vraća njen indeks.
- Ako ciljna vrednost nije prisutna, obrađuje
ValueError
kao izuzetak i ispisuje odgovarajuću poruku.
Zaključak
Evo rezimea različitih metoda za pronalaženje indeksa elementa u Python listi koje smo obradili:
- Možemo koristiti
for
petlje i funkcijurange()
za pristup elementima i njihovim indeksima. Proveravamo da li element na datom indeksu odgovara ciljnoj vrednosti. - Alternativno, možemo koristiti funkciju
enumerate()
za istovremeni pristup elementu i indeksu. - Obe navedene metode se mogu koristiti u list comprehension izrazima.
- Za direktno pronalaženje indeksa elementa, koristimo ugrađenu metodu
.index()
. list.index(value)
vraća indeks prvog pojavljivanja date vrednosti u listi. Ako vrednost nije prisutna, generiše seValueError
.- Možemo pretraživati određeni deo liste korišćenjem
list.index(value, start, end)
da bismo potražili pojavljivanje vrednosti u delu liste[start:end-1]
.
Sledeći korak je učenje kako sortirati Python rečnik po ključu ili vrednosti. Srećno sa programiranjem u Python-u!