Kihagyás

Összetett adattípusok

Az összetett adattípusok olyan adattípusok, amelyek több elemet képesek tárolni egyetlen változóban.

A Pythonban az összetett adattípusok közé tartoznak a listák, halmazok és szótárak.

Lista

  • A listák több elem tárolására szolgálnak egyetlen változóban.
  • A listák Pythonban az adatgyűjtemények tárolására használt 4 beépített adattípus egyike, a másik 3 pedig a Tuple, Set és Dictionary, amelyek mindegyike eltérő minőségű és felhasználású.
  • A listák szögletes zárójelekkel jönnek létre:

Lista inicializálása

  • A lista elemeit [ ] zárójel közé tesszük
  • Az elemeket egymás mellé írjuk vesszővel
  • A lista tartalmazhat intet, stringet, boolet, floatot vegyesen
cars = ["Ford", "Volvo", "BMW"]
grade = [5, 3, 5, 4, 3, 2]

Lista adott elemének elérése

Egy lista adott elemét elérhetjük ha a sorszámra hivatkozunk.

A programozásban a sorszámokat \(0\)-tól kezdjük számolni, tehát az első elem sorszáma \(0\), a másodiké \(1\), stb.

Tegyük fel, hogy a cars listában a következő elemek szerepelnek: ["Ford", "Volvo", "BMW"]. Ezt a listát a következő módon tudnánk táblázatosan ábrázolni:

Sorszám 0. 1. 2.
Elem Ford Volvo BMW
1
2
3
4
5
cars = ["Ford", "Volvo", "BMW"]

elso = cars[0]

print(elso) # Ford

Ismétlés

  • A lista első eleme Pythonban a 0. elemnek felel meg!
  • Tehát egy \(n\) elemű lista utolso eleme az \(n - 1\) elem.

Példa

  • Van egy 100 elemű listánk, ekkor az \(n = 100\), tehát az első elem sorszáma \(0\), az utolsó elem sorszáma pedig \(n-1 = 100-1 = 99\).
  • Még egy példa: Ha egy \(53\) elemű listánk van, akkor \(n = 53\), tehát az utolsó elem sorszáma: \(n-1 = 53-1 = 52\)
  • Az első elem sorszáma továbbra is \(0\).

Műveletek listákkal

  • append(value) - Hozzáad egy elemet a lista végéhez
  • clear() - Eltávolítja az összes elemet a listából
  • copy() - Visszaadja a lista másolatát
  • count(value) - A megadott értékű elemek számát adja vissza
  • extend(value) - A lista bővítése egy új listával
  • remove(value) - Eltávolítja az első elemet a megadott értékkel
  • pop(value) - Eltávolítja az adott pozíción lévő elemet
  • sort(value) - A-Z sorba rendezi az elemeket
sajat_lista = ["Ford", "Volvo", "BMW"]
sajat_lista.muvelet()

Új elem hozzáadása listához

Új elem hozzáadáskor alaptérmezetten a lista végére kerül a beszúrásra az elem.

1
2
3
cars = ["Ford", "Volvo", "BMW"]
cars.append("Honda")
print(cars) # ["Ford", "Volvo", "BMW", "Honda"]

Elem törlése listából

cars = ["Ford", "Volvo", "BMW"]
cars.remove("Volvo")

Lista bejárása

Egy lista bejárását könnyen elvégezhetjük a már tanult for ciklus segítségével.

1
2
3
4
jarmuvek = ["Ford", "Volvo", "BMW"]

for elem in jarmuvek:
    print(elem)

Lista bejárása számokkal

Számok esetében is könnyen bejárhatjuk egy for ciklussal a listánkat. Adjuk össze a lista elemeinket értéket!

1
2
3
4
szamok = [5, 13, 6, 8, 2]

for elem in szamok:
    print(elem)

Lista gyakorló feladatok

Szavak számlálása és első-utolsó kiírása

Kérj be egy szóközzel elválasztott szósorozatot, majd számold meg, hány szó szerepel benne! Írd ki az első és az utolsó szót is a megadott szósorozatból!

Példa
Konzol
Adjon meg egy szóközzel elválasztott szósorozatot: alma körte szilva barack meggy
A megadott szavak száma: 5
Az első szó: alma
Az utolsó szó: meggy
Mit kell tenned?
  • Olvasd be a szavakat
  • Oszd fel a szavakat szóközök mentén
  • Számold meg a szavak számát
  • Jelenítsd meg az első és az utolsó szót
  • Írd ki az eredményeket
Megoldás
szavak = input("Adjon meg egy szóközzel elválasztott szósorozatot: ")
szavak = szavak.split(" ")

szam = len(szavak)
elso = szavak[0]
utolso = szavak[-1]

print(f"A megadott szavak száma: {szam}")
print(f"Az első szó: {elso}")
print(f"Az utolsó szó: {utolso}")

Számok összege

Kérj be egy szóközzel elválasztott számsorozatot, majd:

  • rendezd növekvő sorrendbe
  • számold ki az összegüket
  • számold ki az átlagukat
Példa
Konzol
Adj meg egy szóközzel elválasztott számsorozatot: 55 67 78 23 56 78 98 105

A növekvő sorrendben rendezett számok: [23, 55, 56, 67, 78, 78, 98, 105]
A megadott számok összege: 560
A megadott számok átlaga: 70.0
Legnagyobb szám: 105
Legkisebb szám: 23
Mit kell tenned?
  1. Olvasd be a számokat
  2. Alakítsd át a számokat egész számokká
  3. Add össze a számokat
  4. Jelenítsd meg az összeget
Megoldás
szamok = input("Adjon meg egy szóközzel elválasztott számsorozatot: ")
szamok = szamok.split(" ")
szamok = [int(szam) for szam in szamok] # Átalakítás egész számmá

szamok.sort() # Rendezés növekvő sorrendbe
print(f"A növekvő sorrendben rendezett számok: {szamok}")

osszeg = sum(szamok)
print(f"A megadott számok összege: {osszeg}")

atlag = osszeg / len(szamok)
print(f"A megadott számok átlaga: {atlag}")

minimum = min(szamok)
print(f"A megadott legkisebb szám: {minimum}")

maximum = max(szamok)
print(f"A megadott legnagyobb szám: {maximum}")

Halmaz (Set)

Halmaz jellemzői

Pythonban a halmazok és a listák nagyon hasonlóak. A fő különbségek a következők:

  • Inicializáláskor { } tagok közé írjuk az értékeket
  • Minden eleme csak és kizárólag egyszer szerepelhet
  • Nincs az elemnek sorszáma, nem tudunk külön hivatkozni (sajatlista[1])
halmaz = {"alma", "bereck", "meggy"}
print(halmaz)

Ha nem rendezhetőek az elemek akkor miért vannak sorba a kisebb számok?

Példa

halmaz = {1, 4, 9, 7, 8, 6}
print(halmaz) # halmaz = {1, 4, 6, 7, 8, 9}

A Python set elemei nem rendezettek, de amikor egy halmazt kiírsz vagy listává alakítasz, az elemek gyakran rendezettnek tűnnek, mert a Python belső megvalósítása szerint bizonyos esetekben a kis elemszámú halmazoknál az elemeket növekvő sorrendben tárolja és jeleníti meg. Ez azonban nem egy garantált viselkedés, csak egy mellékhatása annak, hogyan működnek a set-ek. A set-ek alapvetően azért nem rendeltek, mert a háttérben egy hash-alapú adatstruktúrát használnak, ami gyors hozzáférést biztosít, de nem követi az elemek sorrendjét.

Halmaz bejárása

1
2
3
4
halmaz = {"alma", "bereck", "meggy"}

for elem in halmaz:
    print(halmaz)

Új elem hozzáadása halmazhoz

A listával ellenetétben a halmazokban egy elem csak egyszer szerepelhet.

1
2
3
halmaz = {"apple", "banana", "cherry"}
halmaz.add("orange")
print(halmaz)

Megjegyzés

Amennyiben egy olyan elemet adunk a halmazhoz, amit már tartalmaz, azt a rendszer automatikusan nem adja hozzá. Ez a művelet hibát nem eredményez.

Elem törlése halmazból

1
2
3
halmaz = {"apple", "banana", "cherry"}
halmaz.remove("banana")
print(halmaz)

Halmaz egyesítése

Mind matematikában, mind Pythonban lehetőségünk van két halmaz elemeinek egyesítésére. Amennyiben mindkét halmaz tartalmaz egy adott elemet akkor az csak egyszer fog szerepelni.

halmaz1 = {1, 2, 3}
halmaz2 = {3, 4, 5}

# Unió az | operátorral
unio1 = halmaz1 | halmaz2
print(unio1)  # Kimenet: {1, 2, 3, 4, 5}

# Unió az union() metódussal
unio2 = halmaz1.union(halmaz2)
print(unio2)  # Kimenet: {1, 2, 3, 4, 5}

Megjegyzés

Vegyük észre a fennti példában, hogy a 3 csak egyszer szerepel a végeredményben, azonban mindkét halmazban egyaránt szerepel.

Halmaz gyakorló feladatok

Közös elemek keresése

Kérj be két szóközzel elválasztott szósorozatot, majd írd ki az összes elemet, amely bármelyik sorozatban szerepe!

Példa
Konzol
Adjon meg egy szóközzel elválasztott első szósorozatot: alma körte szilva barack
Adjon meg egy szóközzel elválasztott második szósorozatot: körte barack meggy
Az unió: alma, körte, szilva, barack, meggy
Mit kell tenned?
  1. Olvasd be az első és a második szósorozatot
  2. Alakítsd mindkét szósorozatot halmazzá
  3. Találd meg az uniót a két halmaz között
  4. Jelenítsd meg az uniót
Megoldás
elso_sorozat = input("Adjon meg egy szóközzel elválasztott első szósorozatot: ")
masodik_sorozat = input("Adjon meg egy szóközzel elválasztott második szósorozatot: ")
elso_halmaz = set(elso_sorozat.split(" "))
masodik_halmaz = set(masodik_sorozat.split(" "))

unio = elso_halmaz.union(masodik_halmaz)
print(f"Az unió: {unio}")

Szótár (Dictionary)

Szótár jellemzői

  • A szótárak nagyon eltérőek a listától és a halmaztól
  • Ebben az esetben kulcs-érték párokat tárolunk
  • Egy kulcshoz egy érték tartozhat

Szótár inicializálása

  • A szótár mindig egy "kulcs" : "ertek" formátumot követ
  • Az elemeket egymás alá írjuk vesszővel elválasztva
  • A szótár tartalmazhat intet, stringet, boolet, floatot vegyesen
1
2
3
szotar = {
    "kulcs": "ertek"
}

Több kulcs-érték párt is tárolhatunk egy szótárban, ekkor a kulcsokat vesszővel választjuk el egymástól.

1
2
3
4
szotar = {
    "elsokulcs": "ertek",
    "masodikkulcs": "ertek"
}

Szótár példa

Vegyük a Vasas FC játékosait. Minden mezszámhoz egyetlen játékos tartozik

1
2
3
4
5
jatekosok = {
    55: "Jova Levente",
    95: "Dombó Dávid",
    26: "Uram jános"
}

Nézzünk meg egy nyelvi szótárat!

1
2
3
4
szotar = {
    "alma": "apple",
    "szilva": "plum",
}

Megjegyzés

A fenti példák alapján tehát, a bal oldalon találhatóak a kulcsok, a jobb oldalon pedig a hozzájuk tartozó értékek. Így alakulnak ki a kulcs-érték párok.

Szótár adott elemének elérése

Szótárak esetében adott elemre hasonlóan tudunk hivatkozni mint a listáknál, annyi kivétellel, hogy nem az elem számát, hanem a kulcsát adjuk meg.

Szintaxis

szotar.get(kulcs)

Példa

1
2
3
4
5
6
7
8
9
jatekosok = {
    55: "Jova Levente",
    95: "Dombó Dávid",
    26: "Uram jános"
}

ertek = jatekosok.get(55)

print(ertek) # Jova Levente

Másik módszer az érték lekérésre

A fenti példában a get() metódust használtuk az érték lekérésére, azonban alkalmazhatjuk a listáknál tanult módszert is. Ezzel a probléma az, hogy ha a kulcs nem létezik a szótárban, akkor hibát fogunk kapni, ezért ennek használata nem javasolt.

1
2
3
4
5
6
7
jatekosok = {
    55: "Jova Levente"
}

ertek = jatekosok[7]

print(ertek) # Jova Levente

Hibaüzenet

Traceback (most recent call last):
File "main.py", line 5, in <module>
    ertek = jatekosok[7]
KeyError: 7

Több adat tárolása egy kulcshoz

Egy kulcshoz több értéket is tárolhatunk, ekkor a kulcs értéke egy lista lesz.

1
2
3
4
5
jatekosok = {
    55: {"nev": "Jova Levente", "pozicio": "Kapus", "nemzetiseg": "Magyar"},
    95: {"nev": "Dombó Dávid", "pozicio": "Kapus", "nemzetiseg": "Magyar"},
    26: {"nev": "Uram János", "pozicio": "Védő", "nemzetiseg": "Magyar"}
}
Kérjük le az 55-ös mezszámú játékos nevét!
1
2
3
4
5
6
7
jatekosok = {
    55: {"nev": "Jova Levente", "pozicio": "Kapus", "nemzetiseg": "Magyar"},
    95: {"nev": "Dombó Dávid", "pozicio": "Kapus", "nemzetiseg": "Magyar"},
    26: {"nev": "Uram János", "pozicio": "Védő", "nemzetiseg": "Magyar"}
}

ertek = jatekosok.get(55).get("nev") # Jova Levente

Szótár gyakorló feladatok

Ország-főváros párosítás

Készíts egy szótárat, ahol a kulcsok országok nevei, az értékek pedig a hozzájuk tartozó fővárosok! Adj meg néhány országot és fővárosát, majd kérj be egy országot a felhasználótól, és írd ki annak fővárosát! Ha az ország nincs a szótárban, jeleníts meg egy üzenetet, hogy az ország nem található.

Példa
Konzol
Melyik ország fővárosát szeretné megtudni? Magyarország
Magyarország fővárosa: Budapest
Mit kell tenned?
  • Készíts egy szótárat néhány ország-főváros párral
  • Kérj be egy országot a felhasználótól
  • Írd ki az ország fővárosát, ha megtalálható a szótárban
  • Ha az ország nem található, jeleníts meg egy üzenetet
Megoldás
orszagok = {
    "Magyarország": "Budapest",
    "Franciaország": "Párizs",
    "Németország": "Berlin",
    "Olaszország": "Róma"
}

orszag = input("Melyik ország fővárosát szeretné megtudni? ")
if orszag in orszagok:
    print(f"{orszag} fővárosa: {orszagok[orszag]}")
else:
    print("Az ország nem található a szótárban.")

Diák jegyei

Kérj be egy diák nevét és jegyét (pl. „Anna 5”) a felhasználótól, majd bontsd fel a nevet és jegyet egy szótárba! Írd ki a diák nevét és jegyét a konzolra!

Példa
Konzol
Adja meg a diák nevét és jegyét: Anna 5
Jegyek: {'Anna': '5'}
Mit kell tenned?
  • Kérj be egy nevet és egy jegyet a felhasználótól egy sorban
  • Használd a split függvényt a név és a jegy szétválasztásához
  • Hozz létre egy szótárat, ahol a név a kulcs, és a jegy az érték
  • Írd ki a diák nevét és jegyét
Megoldás
bemenet = input("Adja meg a diák nevét és jegyét: ")
darabolt = bemenet.split(" ")

nev = darabolt[0]
jegy = darabolt[1]

diak_jegyek = {} # üres szótár
diak_jegyek[nev] = jegy # elem hozzáadása a szótárhoz

print(f"{nev} jegye: {diak_jegyek.get(nev)}")

Műveletek összehasonlítása

Jelölje adatok a változót, amely a lista, halmaz vagy szótár típusú adatot tartalmazza.

A \(p_1, p_2, p_3\) paraméterek a műveletekhez szükséges paramétereket jelentik.

Ebben az esetben az alábbi műveletek érhetők el:

Lista Halmaz Szótár
Hozzáadás .append(p1) adatok.add(p1) adatok[kulcs] = ertek
Egyesítés .extend(p1) adatok.union(p1) adatok.update(p1)
Törlés .remove(p1) adatok.remove(p1) adatok.pop(p1)
Bejárás for elem in adatok for elem in adatok for elem in adatok
Kiürítés .clear() adatok.clear() adatok.clear()
Másolás .copy adatok.copy() adatok.copy()
Inicializálás list() set() dict()