Lekcija 8: Kolekcije podataka – Liste i Tuple-ovi
Odlično napredujete! Do sada ste radili sa pojedinačnim podacima (brojevi, tekst) i naučili ste kako da ih obrađujete i koristite u uslovima i petljama. Ali šta ako želite da sačuvate više srodnih podataka zajedno? Na primer, listu kupovina, imena studenata, ili brojeve telefona?
Za to nam služe kolekcije podataka. U Pythonu postoji nekoliko ugrađenih kolekcija, a u ovoj lekciji ćemo se fokusirati na dve najčešće i najvažnije za početnike: Liste (Lists) i Tuple-ove (Tuples).
1. Liste (Lists): Dinamičke kolekcije
Lista je najsvestranija i najčešće korišćena kolekcija u Pythonu. Zamislite je kao uređenu listu stvari, gde svaka stvar ima svoj redni broj (indeks).
Ključne karakteristike lista:
- Uređene su: Elementi imaju fiksni redosled i pristupate im putem indeksa.
- Promenljive su (Mutable): Možete dodavati, uklanjati ili menjati elemente nakon što je lista kreirana.
- Dozvoljavaju duplikate: Isti element može se pojaviti više puta u listi.
- Mogu sadržati različite tipove podataka (brojeve, tekst, logičke vrednosti, pa čak i druge liste!).
Kreiranje lista
Liste se kreiraju pomoću uglastih zagrada [], sa elementima razdvojenim zarezima.
# Prazna lista
prazna_lista = []
# Lista brojeva
brojevi = [1, 2, 3, 4, 5]
# Lista stringova
voce = [„jabuka“, „banana“, „pomorandza“, „kivi“]
# Lista sa mešanim tipovima podataka
mesana_lista = [„Tekst“, 123, True, 3.14]
# Lista unutar liste (ugnežđena lista)
matrica = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(f“Brojevi: {brojevi}“)
print(f“Voće: {voce}“)
print(f“Mešana lista: {mesana_lista}“)
Pristupanje elementima liste (Indeksiranje)
Elementima liste pristupamo pomoću njihovog indeksa. U Pythonu, indeksiranje uvek počinje od 0!
- Prvi element ima indeks 0.
- Drugi element ima indeks 1, i tako dalje.
Možete koristiti i negativne indekse:
- -1 se odnosi na poslednji element.
- -2 na pretposlednji, itd.
moj_spisak = [„Laptop“, „Miš“, „Tastatura“, „Monitor“]
# Pristupanje pojedinačnim elementima
print(f“Prvi element: {moj_spisak[0]}“) # Ispisuje „Laptop“
print(f“Drugi element: {moj_spisak[1]}“) # Ispisuje „Miš“
print(f“Poslednji element: {moj_spisak[-1]}“) # Ispisuje „Monitor“
print(f“Pretposlednji element: {moj_spisak[-2]}“) # Ispisuje „Tastatura“
Menjanje elemenata liste
Pošto su liste promenljive, lako možete promeniti vrednost nekog elementa koristeći njegov indeks.
boje = [„crvena“, „plava“, „zelena“]
print(f“Originalne boje: {boje}“)
boje[1] = „žuta“ # Menjamo drugi element (indeks 1)
print(f“Promenjene boje: {boje}“) # Ispisuje [‘crvena’, ‘žuta’, ‘zelena’]
Dodavanje elemenata u listu
Postoji nekoliko načina za dodavanje elemenata:
- .append(element): Dodaje element na kraj liste.
- .insert(indeks, element): Dodaje element na specifičan indeks.
- .extend(druga_lista): Dodaje sve elemente druge liste na kraj trenutne liste.
automobili = [„BMW“, „Mercedes“]
print(f“Početni automobili: {automobili}“)
automobili.append(„Audi“) # Dodaje „Audi“ na kraj
print(f“Posle append: {automobili}“) # Ispisuje [‘BMW’, ‘Mercedes’, ‘Audi’]
automobili.insert(1, „Fiat“) # Dodaje „Fiat“ na indeks 1
print(f“Posle insert: {automobili}“) # Ispisuje [‘BMW’, ‘Fiat’, ‘Mercedes’, ‘Audi’]
novi_modeli = [„Tesla“, „Renault“]
automobili.extend(novi_modeli) # Dodaje elemente iz nove_modele
print(f“Posle extend: {automobili}“) # Ispisuje [‘BMW’, ‘Fiat’, ‘Mercedes’, ‘Audi’, ‘Tesla’, ‘Renault’]
Uklanjanje elemenata iz liste
- .remove(vrednost): Uklanja prvo pojavljivanje navedene vrednosti.
- .pop(indeks): Uklanja element na specifičnom indeksu i vraća ga. Ako ne navedete indeks, uklanja poslednji element.
- del lista[indeks]: Uklanja element na specifičnom indeksu.
- del lista[pocetak:kraj]: Uklanja raspon elemenata (slicing).
- .clear(): Uklanja sve elemente iz liste.
proizvodi = [„Hleb“, „Mleko“, „Jaja“, „Hleb“, „Sir“]
print(f“Početni proizvodi: {proizvodi}“)
proizvodi.remove(„Hleb“) # Uklanja prvo „Hleb“
print(f“Posle remove(‘Hleb’): {proizvodi}“) # Ispisuje [‘Mleko’, ‘Jaja’, ‘Hleb’, ‘Sir’]
uklonjen_element = proizvodi.pop(0) # Uklanja element na indeksu 0 („Mleko“)
print(f“Posle pop(0): {proizvodi}, Uklonjen: {uklonjen_element}“) # Ispisuje [‘Jaja’, ‘Hleb’, ‘Sir’], Uklonjen: Mleko
del proizvodi[1] # Uklanja element na indeksu 1 („Hleb“)
print(f“Posle del proizvodi[1]: {proizvodi}“) # Ispisuje [‘Jaja’, ‘Sir’]
# proizvodi.clear() # Uklanja sve elemente
# print(f“Posle clear(): {proizvodi}“) # Ispisuje []
Slicing (Sečenje) liste
Slicing vam omogućava da izvučete pod-sekcije liste. Sintaksa je lista[pocetak:kraj:korak]. Krajnji indeks nije uključen.
brojevi = [10, 20, 30, 40, 50, 60, 70, 80, 90]
# Od indeksa 2 do kraja
segment1 = brojevi[2:] # [30, 40, 50, 60, 70, 80, 90]
print(f“Segment 1 (od indeksa 2 do kraja): {segment1}“)
# Od početka do indeksa 5 (bez 5)
segment2 = brojevi[:5] # [10, 20, 30, 40, 50]
print(f“Segment 2 (od početka do indeksa 5): {segment2}“)
# Od indeksa 2 do 6 (bez 6)
segment3 = brojevi[2:6] # [30, 40, 50, 60]
print(f“Segment 3 (od indeksa 2 do 6): {segment3}“)
# Cela lista sa korakom 2
segment4 = brojevi[::2] # [10, 30, 50, 70, 90]
print(f“Segment 4 (cela lista sa korakom 2): {segment4}“)
# Kopiranje liste (važno!)
kopija_liste = brojevi[:] # Kreira pravu kopiju, a ne samo referencu
Korisne metode i funkcije za liste
- len(lista): Vraća broj elemenata u listi.
- .sort(): Sortira listu (modifikuje originalnu listu).
- sorted(lista): Vraća novu sortiranu listu (ne menja originalnu).
- .reverse(): Obrće redosled elemenata u listi (modifikuje originalnu listu).
- .count(element): Vraća koliko puta se element pojavljuje u listi.
brojevi_za_sortiranje = [3, 1, 4, 1, 5, 9, 2]
print(f“Originalna lista: {brojevi_za_sortiranje}“)
brojevi_za_sortiranje.sort() # Sortira listu
print(f“Sortirana lista: {brojevi_za_sortiranje}“)
imena = [„Boris“, „Ana“, „Stefan“]
imena.reverse() # Obrće redosled
print(f“Obrnuta lista imena: {imena}“)
pojavljivanja = [1, 2, 2, 3, 2, 4]
broj_dvojki = pojavljivanja.count(2)
print(f“Broj 2 se pojavljuje {broj_dvojki} puta.“)
duzina_liste = len(voce)
print(f“Dužina liste voća: {duzina_liste}“)
2. Tuple-ovi (Tuples): Nepromenljive kolekcije
Tuple (tuple) je sličan listi, ali sa jednom ključnom razlikom: nepromenljiv je (Immutable). To znači da, kada jednom kreirate tuple, ne možete dodavati, uklanjati ili menjati njegove elemente.
Ključne karakteristike tuple-ova:
- Uređeni su: Elementi imaju fiksni redosled i pristupate im putem indeksa.
- Nepromenljivi su (Immutable): Nije ih moguće menjati nakon kreiranja.
- Dozvoljavaju duplikate: Isti element može se pojaviti više puta.
- Mogu sadržati različite tipove podataka.
Kreiranje tuple-ova
Tuple-ovi se kreiraju pomoću običnih zagrada (), sa elementima razdvojenim zarezima.
# Prazan tuple
prazan_tuple = ()
# Tuple brojeva
koordinate = (10, 20)
# Tuple stringova
dani_nedelje = („ponedeljak“, „utorak“, „sreda“)
# Tuple sa mešanim tipovima
profil = („Jelena“, 28, True)
# Tuple sa samo jednim elementom (važno: morate staviti zarez!)
jedan_element_tuple = („jedan“,)
# ovo_nije_tuple = („jedan“) # Ovo bi bio samo string unutar zagrada!
print(f“Koordinate: {koordinate}“)
print(f“Dani nedelje: {dani_nedelje}“)
print(f“Profil: {profil}“)
Pristupanje elementima tuple-a (Indeksiranje)
Pristupa se isto kao listama, pomoću indeksa koji počinju od 0.
moja_tacka = (5, 10, 15)
print(f“X koordinata: {moja_tacka[0]}“) # Ispisuje 5
print(f“Z koordinata: {moja_tacka[2]}“) # Ispisuje 15
Zašto koristiti tuple-ove umesto lista?
- Sigurnost podataka: Ako imate podatke za koje znate da se nikada ne bi trebalo menjati, tuple osigurava tu nepromenljivost.
- Performanse: Tuple-ovi su nešto brži od lista za iteraciju i manje zauzimaju memorije.
- Kao ključevi u rečnicima: Tuple-ovi se mogu koristiti kao ključevi u rečnicima (što liste ne mogu).
Konverzija između lista i tuple-ova
Možete lako konvertovati liste u tuple-ove i obrnuto.
lista_u_tuple = [1, 2, 3]
konvertovan_tuple = tuple(lista_u_tuple)
print(f“Lista u tuple: {konvertovan_tuple}“) # Ispisuje (1, 2, 3)
tuple_u_listu = („a“, „b“, „c“)
konvertovana_lista = list(tuple_u_listu)
print(f“Tuple u listu: {konvertovana_lista}“) # Ispisuje [‘a’, ‘b’, ‘c’]
Praktičan primer: Jednostavna lista zadataka (To-Do List)
Hajde da napravimo program koji će omogućiti korisniku da dodaje i pregleda stavke na listi zadataka. Koristićemo sve što smo naučili do sada.
# Jednostavna To-Do Lista
lista_zadataka = [] # Prazna lista za čuvanje zadataka
print(„Dobrodošli u vašu To-Do Listu!“)
while True: # Beskonačna petlja koja će se prekinuti sa ‘break’
print(„\nOdaberite opciju:“)
print(„1. Dodaj zadatak“)
print(„2. Prikaži sve zadatke“)
print(„3. Obriši zadatak“)
print(„4. Izlaz“)
izbor = input(„Unesite broj opcije: „)
if izbor == ‘1’:
zadatak = input(„Unesite novi zadatak: „)
lista_zadataka.append(zadatak)
print(f“‘{zadatak}’ je dodat na listu.“)
elif izbor == ‘2’:
if not lista_zadataka: # Proverava da li je lista prazna
print(„Lista zadataka je prazna.“)
else:
print(„\n— VAŠI ZADACI —„)
for i, zadatak in enumerate(lista_zadataka): # enumerate daje i indeks i element
print(f“{i + 1}. {zadatak}“)
print(„——————-„)
elif izbor == ‘3’:
if not lista_zadataka:
print(„Lista zadataka je prazna, nema šta za brisanje.“)
else:
print(„\n— ZADACI ZA BRISANJE —„)
for i, zadatak in enumerate(lista_zadataka):
print(f“{i + 1}. {zadatak}“)
print(„————————-„)
try:
indeks_za_brisanje = int(input(„Unesite redni broj zadatka za brisanje: „)) – 1 # -1 jer indeksi počinju od 0
if 0 <= indeks_za_brisanje < len(lista_zadataka):
obrisan_zadatak = lista_zadataka.pop(indeks_za_brisanje)
print(f“Zadatak ‘{obrisan_zadatak}’ je obrisan.“)
else:
print(„Nevalidan redni broj.“)
except ValueError:
print(„Molimo unesite validan broj.“)
except IndexError: # Iako je gornja provera pokriva, ovo je dodatna sigurnost
print(„Nevalidan redni broj.“)
elif izbor == ‘4’:
print(„Izlazim iz programa. Doviđenja!“)
break # Prekidamo ‘while’ petlju i izlazimo iz programa
else:
print(„Nevalidna opcija. Molimo pokušajte ponovo.“)
Pitanja i odgovori (FAQ)
P: Koja je glavna razlika između lista i tuple-ova?
O: Glavna razlika je u promenljivosti: liste su promenljive (mutable), što znači da se mogu menjati (dodavati, brisati, menjati elementi) nakon kreiranja, dok su tuple-ovi nepromenljivi (immutable), što znači da se njihov sadržaj ne može menjati nakon kreiranja.
P: Kako se zove prvi element u listi ili tuple-u?
O: Prvi element uvek ima indeks 0.
P: Šta se dešava ako pokušam da pristupim indeksu koji ne postoji u listi?
O: Dobićete IndexError. Na primer, ako lista ima 3 elementa (indeksi 0, 1, 2) i pokušate da pristupite lista[3], dobićete grešku.
P: Mogu li liste da sadrže različite tipove podataka?
O: Da, liste mogu sadržati mešavinu različitih tipova podataka (npr. brojeve, stringove, logičke vrednosti, pa čak i druge liste).
P: Kada bih koristio tuple umesto liste?
O: Koristili biste tuple kada imate skup srodnih podataka koji ne bi trebalo da se menjaju tokom izvršavanja programa (npr. koordinate tačke, RGB vrednosti boje). Takođe, tuple-ovi su nešto performantniji za male skupove podataka i mogu se koristiti kao ključevi u rečnicima.
Relevantni linkovi
- W3Schools – Python Lists (engleski): w3schools.com/python/python_lists.asp
- W3Schools – Python Tuples (engleski): w3schools.com/python/python_tuples.asp
- Real Python – Python Lists and Tuples (engleski): realpython.com/python-lists-tuples/
- Zvanična Python dokumentacija – Data Structures (engleski): docs.python.org/3/tutorial/datastructures.html
Čestitamo! Sada znate kako da koristite liste i tuple-ove za organizovanje podataka u svojim programima. Ovo je ogroman korak ka pisanju kompleksnijih i funkcionalnijih aplikacija. U sledećoj lekciji ćemo istražiti još jednu važnu kolekciju: rečnike i skupove, koje će vam omogućiti još fleksibilnije načine skladištenja podataka!


