====== Adatszerkezetek II. – dict, set ======
Dictionary: kulcs–érték párok gyűjteménye, mint egy valódi szótár. Hasonlít a C nyelv struktúrájára.
* Kapcsos zárójel: {}
* Kulcs és érték kettősponttal elválasztva
* Kulcsok egyediek
* print(szemely["nev"])
szemely = {
"nev": "Anna",
"kor": 25,
"varos": "Budapest"
}
Példa: Hozz létre egy dictionary-t saját adataiddal (név, kor, kedvenc szám). Írd ki külön a nevet. Írd ki az egész dictionary-t.
adat = {
"nev": "Anna",
"kor": 20,
"kedvenc_szam": 7
}
print("Név:", adat["nev"])
print("Teljes adat:", adat)
**Módosítás és bővítés**
* Új kulcs hozzáadása
* Érték módosítása
szemely["kor"] = 26
szemely["foglalkozas"] = "mérnök"
Példa: Hozz létre egy üres dictionary-t. Kérd be a felhasználó nevét és életkorát. Tárold el dictionary-ben. Írd ki az eredményt.
adat = {}
nev = input("Név: ")
kor = int(input("Kor: "))
adat["nev"] = nev
adat["kor"] = kor
print(adat)
**Dictionary bejárása**
szemely = {"nev": "Anna", "kor": 25}
for kulcs in szemely:
print(kulcs, szemely[kulcs])
#Kulcs–érték együtt:
for kulcs, ertek in szemely.items():
print(kulcs, ertek)
Példa: Hozz létre egy dictionary-t 3 tantárggyal és jeggyel. Írd ki az átlagot.
jegyek = {
"matek": 4,
"fizika": 5,
"angol": 3
}
osszeg = 0
for ertek in jegyek.values():
osszeg += ertek
atlag = osszeg / len(jegyek)
print("Átlag:", atlag)
==== Dict fő metódusai ====
^ Metódus ^ Funkció | Példa |
| dict.keys() | Visszaadja a kulcsok listáját (view object) | d.keys() |
| dict.values() | Visszaadja az értékek listáját | d.values() |
| dict.items() | Visszaadja a kulcs-érték párokat | d.items() |
| dict.get(key[, default]) | Visszaadja a kulcshoz tartozó értéket, ha nincs → default | d.get("x", 0) |
| dict.pop(key[, default]) | Törli a kulcsot és visszaadja az értékét | d.pop("x") |
| dict.popitem() | Törli és visszaad egy tetszőleges kulcs-érték párt | d.popitem() |
| dict.update([other]) | Másik szótár vagy iterable alapján frissít | d.update({"y":10}) |
| dict.clear() | Törli az összes elemet | d.clear() |
| dict.setdefault(key[, default]) | Ha nincs kulcs, létrehozza alapértelmezett értékkel | d.setdefault("x",0) |
| dict.copy() | Felületes másolat készít | d2 = d.copy() |
----
==== Set alapjai ====
Set: egyedi elemek gyűjteménye, halmaza.
* Nincs indexelés
* Nem tartalmaz duplikációt
szamok = {1, 2, 3, 3, 2}
print(szamok)
Példa: Kérj be 5 számot. Tárold el listában. Alakítsd át set-té. Írd ki az egyedi elemeket
szamok = []
for i in range(5):
szam = int(input("Adj meg egy számot: "))
szamok.append(szam)
egyedi = set(szamok)
print("Egyedi elemek:", egyedi)
==== Set fő metódusai ====
^ set.add(x) ^ Hozzáad egy elemet | s.add(5) |
| set.update(iterable) | Több elemet ad hozzá | s.update([1,2,3]) |
| set.remove(x) | Eltávolítja az elemet (ha nincs → KeyError) | s.remove(2) |
| set.discard(x) | Eltávolítja az elemet, ha van (hiba nélkül) | s.discard(2) |
| set.pop() | Eltávolít egy tetszőleges elemet | s.pop() |
| set.clear() | Összes elem törlése | s.clear() |
| set.copy() | Felületes másolat | s2 = s.copy() |
| set.union(other) | Egyesítés | s.union({4,5}) |
| set.intersection(other) | Metszet | s.intersection({2,3}) |
| set.difference(other) | Különbség | s.difference({1,2}) |
| set.symmetric_difference(other) | Szimmetrikus különbség | s.symmetric_difference({1,2}) |
| set.issubset(other) | Részhalmaz-e | s.issubset({1,2,3}) |
| set.issuperset(other) | Felülhalmaz-e | s.issuperset({1}) |
----
==== Összefoglaló feladatok ====
**1. feladat** Írj programot, ami:
* Bekér 5 nevet
* Minden névhez bekér egy pontszámot
* Dictionary-ben tárolja
* Kiírja a legmagasabb pontszámot elért nevet
eredmenyek = {}
for i in range(5):
nev = input("Név: ")
pont = int(input("Pontszám: "))
eredmenyek[nev] = pont
max_nev = None
max_pont = -1
for nev, pont in eredmenyek.items():
if pont > max_pont:
max_pont = pont
max_nev = nev
print("Legjobb eredmény:", max_nev, max_pont)
**2. feladat:** Van egy dict, ahol a kulcs a diák neve, az érték egy set az általa elvégzett tantárgyak jegyeivel.
* Adj hozzá egy új tantárgyat minden diáknak
* Ellenőrizd, hogy van-e 5-ös jegye minden diáknak
* Számold meg, hány diák kapott 1-es jegyet
diakok = {
"Anna": {5, 4, 3},
"Bence": {2, 3, 5},
"Csaba": {1, 2, 3}
}
# Új tantárgy 4-es jeggyel minden diáknak
for nev, jegyek in diakok.items():
jegyek.add(4)
# Ellenőrzés: van-e 5-ös jegy
for nev, jegyek in diakok.items():
if 5 in jegyek:
print(f"{nev} kapott 5-öst")
# 1-es jegyek száma
egyessel = sum(1 in jegyek for jegyek in diakok.values())
print("1-es jegyet kapott diákok száma:", egyessel)
**3. feladat:** Van egy bolt dict-ben a termékek és mennyiségek formájában.
* Egy új szállítmány érkezik egy másik dict-ből → frissítsd a raktárt
* Távolítsd el azokat a termékeket, amelyek elfogytak (0)
* Írd ki a teljes készletet
raktar = {"alma": 10, "korte": 5, "banan": 0}
szallitas = {"alma": 5, "banan": 7, "narancs": 3}
# Raktár frissítése
for termek, db in szallitas.items():
raktar[termek] = raktar.get(termek, 0) + db
# Elfogyott termékek törlése
torlendo = [k for k,v in raktar.items() if v == 0]
for k in torlendo:
raktar.pop(k)
print("Aktuális készlet:", raktar)
**4. feladat:** Adott két set a bolt A és B kínálatával.
* Írd ki, mely termékek vannak mindkét boltban (metszet)
* Melyek vannak csak az egyik boltban (szimmetrikus különbség)
* Egyesítsd a készleteket
boltA = {"alma", "banan", "narancs"}
boltB = {"korte", "banan", "narancs", "szilva"}
print("Mindkettőben:", boltA.intersection(boltB))
print("Csak az egyikben:", boltA.symmetric_difference(boltB))
boltA.update(boltB)
print("Összes termék:", boltA)
**5. feladat:**Egy dict dolgozó neve → set projektek.
* Adj hozzá új projektet minden dolgozónak
* Töröld azokat a projekteket, amelyeken senki sem dolgozik
* Írd ki a dolgozónkénti projektlistát
dolgozok = {
"Eva": {"A", "B"},
"Gabor": {"B", "C"},
"Ilona": {"C"}
}
# Új projekt D mindenkihez
for projektek in dolgozok.values():
projektek.add("D")
# Ellenőrizzük, mely projektek senkinél sem szerepelnek
osszes = set().union(*dolgozok.values())
nem_aktiv = {"E", "F"} - osszes
print("Nem aktív projektek:", nem_aktiv)
print("Dolgozók projektjei:")
for nev, projektek in dolgozok.items():
print(nev, ":", projektek)
6. feladat: Adott egy szöveg string.
* Készíts dict-et, ahol a kulcs a szó, az érték a darabszám
* Távolítsd el a ritkán előforduló szavakat (pl. egyszer előforduló)
* Írd ki a leggyakoribb szót
szoveg = "python lista ciklus python python adatszerkezet lista ciklus"
szavak = szoveg.split()
szavak_szam = {}
for szo in szavak:
szavak_szam[szo] = szavak_szam.get(szo, 0) + 1
# Ritka szavak törlése
for szo in list(szavak_szam.keys()):
if szavak_szam[szo] == 1:
szavak_szam.pop(szo)
# Leggyakoribb szó
leggyakoribb = max(szavak_szam, key=szavak_szam.get)
print("Leggyakoribb szó:", leggyakoribb)
print("Szó előfordulások:", szavak_szam)