Programiranje

Lekcija 9: Kolekcije podataka -Python programiranje

Lekcija 9 objašnjava ključne koncepte kolekcija podataka u Python programiranju – rečnike (dict) i skupove (set). Rečnici omogućavaju organizaciju podataka kroz parove ključ-vrednost, dok skupovi čuvaju jedinstvene, neuređene elemente bez duplikata. Tekst je posebno prilagođen početnicima u Srbiji i regionu, uz praktične primere, objašnjenja metoda kao što su `.get()`, `.add()`, `.pop()`, i operacije kao što su unija i presek. Ova lekcija je deo serijala o učenju Pythona na srpskom jeziku i oslanja se na lokalni kontekst učenja programiranja. Idealna je za srednjoškolce, studente i samouke programere koji žele da unaprede svoje veštine u radu sa podacima u Python jeziku.

Lekcija 9: Kolekcije podataka – Rečnici i Skupovi

Odlično! U prošloj lekciji smo istražili liste i tuple-ove, naučivši kako da organizujemo kolekcije podataka po redosledu. Sada je vreme da upoznamo dve nove, moćne strukture podataka: rečnike (Dictionaries) i skupove (Sets). Ove kolekcije nude drugačije načine organizovanja informacija, što ih čini izuzetno korisnim u različitim scenarijima.

1. Rečnici (Dictionaries): Parovi ključ-vrednost

Rečnik je neuređena kolekcija parova ključ-vrednost. Zamislite ga kao pravi rečnik gde svaka reč (ključ) ima svoje objašnjenje (vrednost). Umesto da pristupate elementima pomoću brojčanog indeksa (kao kod lista), pristupate im pomoću jedinstvenog ključa.

Ključne karakteristike rečnika:

  • Neuređeni su (do Pythona 3.7): Pre Pythona 3.7, redosled elemenata nije bio garantovan. Od Pythona 3.7 pa nadalje, rečnici pamte redosled unosa elemenata, što ih praktično čini uređenima.
  • Promenljivi su (Mutable): Možete dodavati, uklanjati ili menjati parove ključ-vrednost nakon što je rečnik kreiran.
  • Ključevi moraju biti jedinstveni: Svaki ključ u rečniku mora biti jedinstven. Ako pokušate da dodate ključ koji već postoji, nova vrednost će zameniti staru.
  • Ključevi moraju biti nepromenljivi (Immutable): Ključevi mogu biti samo nepromenljivi tipovi podataka (npr. stringovi, brojevi, tuple-ovi). Liste ne mogu biti ključevi.
  • Vrednosti mogu biti bilo kog tipa: Vrednosti mogu biti bilo koji tip podataka (brojevi, stringovi, liste, drugi rečnici, itd.).

Kreiranje rečnika

Rečnici se kreiraju pomoću vitičastih zagrada {}, sa parovima ključ:vrednost razdvojenim zarezima.

# Prazan rečnik
prazan_recnik = {}

# Rečnik sa informacijama o osobi
osoba = {
    „ime“: „Ana“,
    „prezime“: „Anić“,
    „godine“: 30,
    „grad“: „Beograd“,
    „aktivan“: True
}

# Rečnik sa cenama proizvoda
cene_proizvoda = {
    „Jabuka“: 120,
    „Mleko“: 150,
    „Hleb“: 80
}

# Rečnik čije vrednosti su liste
drzave_gradovi = {
    „Srbija“: [„Beograd“, „Novi Sad“, „Niš“],
    „Hrvatska“: [„Zagreb“, „Split“],
    „Bosna i Hercegovina“: [„Sarajevo“, „Banja Luka“]
}

print(f“Informacije o osobi: {osoba}“)
print(f“Cene proizvoda: {cene_proizvoda}“)
print(f“Države i gradovi: {drzave_gradovi}“)

 

Pristupanje vrednostima (po ključu)

Vrednostima u rečniku pristupate korišćenjem ključa u uglastim zagradama [].

osoba = {
    „ime“: „Ana“,
    „prezime“: „Anić“,
    „godine“: 30,
    „grad“: „Beograd“
}

print(f“Ime osobe: {osoba[‘ime’]}“)      # Ispisuje „Ana“
print(f“Grad osobe: {osoba[‘grad’]}“)    # Ispisuje „Beograd“

# Ako pokušate da pristupite nepostojećem ključu, dobićete KeyError
# print(osoba[‘adresa’]) # Ovo bi izazvalo grešku!

# Siguran način za pristup: .get() metoda
# Vraća None ako ključ ne postoji, ili specificiranu podrazumevanu vrednost
adresa = osoba.get(„adresa“, „Nema adrese“)
print(f“Adresa osobe: {adresa}“) # Ispisuje „Nema adrese“

godine = osoba.get(„godine“)
print(f“Godine osobe: {godine}“) # Ispisuje 30

 

Dodavanje i menjanje elemenata rečnika

Dodavanje novog para ključ-vrednost ili menjanje postojeće vrednosti radi se na isti način, dodelom vrednosti ključu.

student = {
    „ime“: „Marko“,
    „fakultet“: „ETF“
}
print(f“Početni podaci o studentu: {student}“)

# Dodavanje novog elementa
student[„broj_indeksa“] = „2023/001“
print(f“Posle dodavanja broja indeksa: {student}“)

# Menjanje postojećeg elementa
student[„fakultet“] = „Mašinski fakultet“
print(f“Posle promene fakulteta: {student}“)

 

Uklanjanje elemenata iz rečnika

  • del recnik[kljuc]: Uklanja par ključ-vrednost.
  • .pop(kljuc): Uklanja element sa navedenim ključem i vraća njegovu vrednost.
  • .popitem(): Uklanja poslednji dodati par ključ-vrednost (od Pythona 3.7) i vraća ga kao tuple.
  • .clear(): Uklanja sve elemente iz rečnika.

korisnik = {
    „id“: 101,
    „ime“: „Petar“,
    „email“: „petar@example.com“,
    „status“: „aktivan“
}
print(f“Početni podaci korisnika: {korisnik}“)

del korisnik[„status“] # Uklanja ključ „status“
print(f“Posle del ‘status’: {korisnik}“)

uklonjen_email = korisnik.pop(„email“) # Uklanja „email“ i vraća njegovu vrednost
print(f“Posle pop(’email’): {korisnik}, Uklonjen email: {uklonjen_email}“)

# poslednji_par = korisnik.popitem() # Uklanja poslednji par (id: 101)
# print(f“Posle popitem(): {korisnik}, Poslednji par: {poslednji_par}“)

# korisnik.clear() # Uklanja sve elemente
# print(f“Posle clear(): {korisnik}“)

 

Iteracija kroz rečnike (sa for petljom)

Možete iterirati kroz rečnike na nekoliko načina:

  • Direktno kroz ključeve: for kljuc in recnik:
  • Kroz ključeve koristeći .keys(): for kljuc in recnik.keys():
  • Kroz vrednosti koristeći .values(): for vrednost in recnik.values():
  • Kroz parove ključ-vrednost koristeći .items(): for kljuc, vrednost in recnik.items():

automobil = {
    „marka“: „Toyota“,
    „model“: „Corolla“,
    „godina“: 2020,
    „cena“: 18000
}

print(„\nIteracija kroz ključeve:“)
for k in automobil: # ili for k in automobil.keys():
    print(k)

print(„\nIteracija kroz vrednosti:“)
for v in automobil.values():
    print(v)

print(„\nIteracija kroz parove ključ-vrednost:“)
for kljuc, vrednost in automobil.items():
    print(f“{kljuc}: {vrednost}“)

 

2. Skupovi (Sets): Jedinstvene, neuređene kolekcije

Skup je neuređena kolekcija jedinstvenih elemenata. Zamislite ga kao matematički skup: svaki element može se pojaviti samo jednom, a redosled elemenata nije bitan.

Ključne karakteristike skupova:

  • Neuređeni su: Elementi nemaju fiksni redosled.
  • Promenljivi su (Mutable): Možete dodavati i uklanjati elemente.
  • Ne dozvoljavaju duplikate: Ako pokušate da dodate element koji već postoji, on se jednostavno ignoriše.
  • Mogu sadržati samo nepromenljive tipove podataka (brojeve, stringove, tuple-ove). Liste i rečnici ne mogu biti elementi skupa.

Kreiranje skupova

Skupovi se kreiraju pomoću vitičastih zagrada {}, ali samo sa elementima (bez ključeva), razdvojenim zarezima. Za kreiranje praznog skupa koristite set().

# Prazan skup
prazan_skup = set() # Nije {} jer bi to kreiralo prazan rečnik

# Skup brojeva (duplikati se automatski ignorišu)
brojevi_set = {1, 2, 3, 2, 1, 4}
print(f“Skup brojeva: {brojevi_set}“) # Ispisuje {1, 2, 3, 4} (redosled može varirati)

# Skup stringova
boje_set = {„crvena“, „plava“, „zelena“, „crvena“}
print(f“Skup boja: {boje_set}“) # Ispisuje {‘crvena’, ‘plava’, ‘zelena’}

# Konverzija liste u skup (za uklanjanje duplikata)
lista_sa_duplikatima = [1, 2, 2, 3, 1, 4, 4]
skup_bez_duplikata = set(lista_sa_duplikatima)
print(f“Lista sa duplikatima: {lista_sa_duplikatima}“)
print(f“Skup bez duplikata: {skup_bez_duplikata}“)

 

Dodavanje i uklanjanje elemenata iz skupa

  • .add(element): Dodaje element u skup.
  • .remove(element): Uklanja element. Izaziva KeyError ako element ne postoji.
  • .discard(element): Uklanja element. Ne izaziva grešku ako element ne postoji.
  • .pop(): Uklanja i vraća nasumični element.
  • .clear(): Uklanja sve elemente.

moji_predmeti = {„Matematika“, „Fizika“}
print(f“Moji predmeti: {moji_predmeti}“)

moji_predmeti.add(„Programiranje“)
print(f“Posle dodavanja ‘Programiranje’: {moji_predmeti}“)

moji_predmeti.add(„Matematika“) # Duplikat se ignoriše
print(f“Posle dodavanja ‘Matematika’ (ignorisano): {moji_predmeti}“)

moji_predmeti.remove(„Fizika“)
print(f“Posle uklanjanja ‘Fizika’: {moji_predmeti}“)

moji_predmeti.discard(„Hemija“) # „Hemija“ ne postoji, ali nema greške
print(f“Posle discard(‘Hemija’): {moji_predmeti}“)

# uklonjen_element = moji_predmeti.pop() # Uklanja nasumičan element
# print(f“Uklonjen nasumičan element: {uklonjen_element}, Preostali: {moji_predmeti}“)

 

Operacije sa skupovima (Matematičke operacije)

Skupovi su izuzetno korisni za brze operacije poput:

  • Unija (union() ili |): Svi jedinstveni elementi iz oba skupa.
  • Presek (intersection() ili &): Elementi koji su zajednički za oba skupa.
  • Razlika (difference() ili -): Elementi koji su u prvom skupu, ali ne i u drugom.
  • Simetrična razlika (symmetric_difference() ili ^): Elementi koji su u jednom ili drugom skupu, ali ne u oba.

skup_a = {1, 2, 3, 4}
skup_b = {3, 4, 5, 6}

unija = skup_a.union(skup_b) # ili skup_a | skup_b
print(f“Unija (A unija B): {unija}“) # {1, 2, 3, 4, 5, 6}

presek = skup_a.intersection(skup_b) # ili skup_a & skup_b
print(f“Presek (A presek B): {presek}“) # {3, 4}

razlika_ab = skup_a.difference(skup_b) # ili skup_a – skup_b
print(f“Razlika (A minus B): {razlika_ab}“) # {1, 2}

razlika_ba = skup_b.difference(skup_a) # ili skup_b – skup_a
print(f“Razlika (B minus A): {razlika_ba}“) # {5, 6}

simetricna_razlika = skup_a.symmetric_difference(skup_b) # ili skup_a ^ skup_b
print(f“Simetrična razlika: {simetricna_razlika}“) # {1, 2, 5, 6}

 

Praktičan primer: Praćenje jedinstvenih posetilaca veb sajta

Zamislite da želite da pratite jedinstvene IP adrese posetilaca veb sajta. Skup je idealan za ovo jer automatski ignoriše duplikate.

# Program: Praćenje jedinstvenih posetilaca

jedinstveni_posetioci = set() # Skup za čuvanje jedinstvenih IP adresa

print(„Simulator praćenja posetilaca veb sajta (unesite ‘kraj’ za izlaz).“)

while True:
    ip_adresa = input(„Unesite IP adresu posetioca: „)

    if ip_adresa.lower() == ‘kraj’:
        break
   
    if ip_adresa in jedinstveni_posetioci: # Provera da li je IP već u skupu
        print(f“IP adresa {ip_adresa} je već zabeležena (ponovna poseta).“)
    else:
        jedinstveni_posetioci.add(ip_adresa)
        print(f“Nova jedinstvena IP adresa {ip_adresa} zabeležena.“)
   
    print(f“Trenutno jedinstvenih posetilaca: {len(jedinstveni_posetioci)}“)
    print(f“Sve zabeležene jedinstvene IP adrese: {jedinstveni_posetioci}“)

print(„\nPraćenje završeno.“)
print(f“Ukupan broj jedinstvenih posetilaca: {len(jedinstveni_posetioci)}“)

 

Pitanja i odgovori (FAQ)

P: Koja je glavna razlika između rečnika i lista?

O: Glavna razlika je način pristupa elementima. Kod lista, elementima se pristupa pomoću indeksa (brojčanog redosleda, počevši od 0). Kod rečnika, elementima se pristupa pomoću jedinstvenih ključeva (koji su obično stringovi ili brojevi). Rečnici su takođe neuređeni (iako od Pythona 3.7 pamte redosled unosa).

P: Mogu li rečnici i skupovi sadržati liste kao elemente?

O: Rečnici mogu imati liste kao vrednosti, ali ne i kao ključeve. Skupovi ne mogu imati liste (ni rečnike) kao svoje elemente, jer liste i rečnici nisu nepromenljivi (mutable). Skupovi mogu sadržati samo nepromenljive tipove podataka (brojevi, stringovi, tuple-ovi).

P: Kada bih koristio rečnik, a kada skup?

O:* Koristite rečnik kada treba da skladištite podatke kao parove ključ-vrednost i kada vam je potreban brz pristup vrednostima po ključu (npr. informacije o korisniku, konfiguracije).

* Koristite skup kada vam je potrebna kolekcija jedinstvenih elemenata i kada vam nije bitan redosled, ili kada želite da izvodite brze matematičke operacije sa skupovima (unija, presek).

P: Šta se dešava ako pokušam da dodam ključ koji već postoji u rečniku?

O: Vrednost povezana sa tim ključem će biti ažurirana (pregažena) novom vrednošću.

P: Kako se kreira prazan rečnik i prazan skup?

O: Prazan rečnik se kreira sa {}, dok se prazan skup kreira sa set(). set() se koristi za skup jer bi {} kreiralo prazan rečnik.

Relevantni linkovi

Čestitamo! Sada ste upoznati sa rečnicima i skupovima, što vam daje još više opcija za organizovanje i manipulisanje podacima u Pythonu. Razumevanje ovih kolekcija je ključno za pisanje efikasnog i dobro strukturiranog koda. U sledećoj lekciji ćemo se fokusirati na funkcije, koje nam omogućavaju da pišemo modularan i ponovo upotrebljiv kod!

Python Lekcija 9 – Kolekcije podataka: Rečnici i Skupovi
Lekcija 9: Upoznajte se sa rečnicima (dict) i skupovima (set) u Python programskom jeziku.

Nebojsa Kostić

Rođen 1976. Bavim se računarima I it poslovima više od 20 godina..Osnivač TechFokusa i tehnološki novinar sa preko 20 godina iskustva. Specijalizovan je za hardver, retro računare i tržišne analize.

Nebojsa Kostić has 423 posts and counting. See all posts by Nebojsa Kostić

Оставите одговор

Ваша адреса е-поште неће бити објављена. Неопходна поља су означена *