Како пронаћи индекс ставке у Питхон листама

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 i end su opcionni pozicioni argumenti; mogu se koristiti za pretragu indeksa elementa u određenom delu liste, počevši od start i završavajući se sa end – 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 funkciju range() 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 se ValueError.
  • 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!