Kollekciók¶
Ezen a gyakorlaton áttekintjük a fontosabb tudnivalókat a Python két hasznos adatszerkezetéről: a listáról és a dictionary-ről.
Lista¶
Pythonban nincs natív, statikus tömb adatszerkezet, ehelyett listát használunk.
A listára tekinthetünk egy dinamikus méretű tömbként, amely tetszőleges számú, nem feltétlen azonos típusú elemek tárolására alkalmas adatszerkezet.
Lista létrehozása¶
Pythonban egy listát létrehozhatunk...
- ...a
list()
beépített függvénnyel (ez tulajdonképpen egy konstruktor) - ...a listaelemek szögletes zárójelek közötti felsorolásával.
Példa: Lista létrehozása
1 2 3 4 |
|
Lista hosszának lekérdezése¶
Ha le szeretnénk kérdezni egy lista hosszát (azaz a listában található elemek számát), akkor ezt az előző gyakorlaton megismert len()
függvénnyel tudjuk megtenni.
1 2 |
|
Kimenet
3
Listaelemek indexelése¶
A listák elemeit a szokásos tömbindex operátorokkal tudjuk elérni: lista_neve[index]
.
Az indexelés itt is 0-tól kezdődik. Az előző gyakorlaton a stringeknél tanult negatív, illetve intervallumos indexelés a listáknál is működik.
1 2 3 4 5 6 7 8 |
|
Kimenet
alma pomeló ['citrom', 'barack'] ['barack', 'pomeló'] ['alma', 'citrom', 'barack', 'pomeló'] ['alma', 'barack']
Ha egy listát meg szeretnénk fordítani, akkor a stringeknél tanult trükköt itt is használhatjuk.
1 2 |
|
Kimenet
['pomeló', 'barack', 'citrom', 'alma']
A stringekkel ellentétben a listáknál lehetőségünk van egy adott indexen lévő elem értékének módosítására. Ezt úgy is mondjuk, hogy a lista egy mutable (módosítható) típus. (A stringek karaktereit nem tudtuk módosítani, hiszen a string egy immutable típus volt.)
1 2 3 4 |
|
Kimenet
['alma', 'görögdinnye', 'barack', 'pomeló']
Listaelemek bejárása¶
Ha végig szeretnénk iterálni egy lista elemein, akkor ezt egy for
ciklussal egyszerűen megtehetjük. A lista elemeit bejárhatjuk a korábban tanult, listaszerű for
ciklussal vagy akár az indexeken végigmenve is megvalósítható az elemek bejárása.
1 2 3 4 5 6 7 8 9 |
|
Ha az elemeket módosítani szeretnénk a bejárás során, akkor az index alapú bejárást válasszuk!
Referencia szerinti működés¶
Pythonban a listák referencia szerint működnek. Ez azt jelenti, hogy ha átadunk egy függvénynek egy listát paraméterül, akkor a függvény nem a kapott lista másolatával, hanem az eredeti listával fog dolgozni.
1 2 3 4 5 6 7 8 9 10 11 |
|
Kimenet
['ALMA', 'CITROM', 'BARACK', 'POMELÓ'] ['ALMA', 'CITROM', 'BARACK', 'POMELÓ']
A fenti kódpéldában jól látható, hogy a függvényhívás következtében az eredeti gyumolcsok
lista tartalma módosult a referencia szerinti paraméterátadás következtében.
Ha nem szeretnénk, hogy az eredeti listánk tartalmát módosítsa a függvény, akkor készítsünk a listánkról egy másolatot, és dolgozzunk azzal! Egy lista lemásolásához használjuk a lista_neve[:]
szintaxist!
1 2 3 4 5 6 7 8 9 10 11 |
|
Kimenet
['ALMA', 'CITROM', 'BARACK', 'POMELÓ'] ['alma', 'citrom', 'barack', 'pomeló']
Listaelem előfordulásának ellenőrzése¶
Az elem in lista
szintaxissal lekérdezhetjük, hogy elem
szerepel-e a lista
elemei között.
Példa: Szerepel-e Hulk a bosszúállók között?
1 2 3 4 |
|
Kimenet
Hulk a bosszúállók közé tartozik.
Adott indexű listaelem törlése¶
A del lista[i]
szintaxissal törölhetjük a lista
i
. indexén található elemet.
Példa: A 2. indexű elem törlése egy listából
1 2 3 4 |
|
Kimenet
['Thor', 'Hulk', 'Hangya', 'Vasember']
Listák összefűzése¶
A +
(plusz) operátorral összefűzhetjük két vagy több lista tartalmát.
Példa: Két lista összefűzése
1 2 3 4 5 |
|
Kimenet
['Thor', 'Hulk', 'Vízió', 'Hangya', 'Vasember']
Egy lista extend()
metódusával hozzá tudjuk fűzni az adott listához egy másik lista elemeit.
Példa: A bosszuallok1
listához hozzáfűzzük a bosszuallok2
lista elemeit
1 2 3 4 5 |
|
Kimenet
['Thor', 'Hulk', 'Vízió', 'Hangya', 'Vasember']
Listakezelő függvények¶
Pythonban számos beépített függvényt használhatunk listák kezelésére. Néhány fontosabb:
lista.append(e)
: beszúrja aze
elemet alista
végérelista.insert(i, e)
: beszúrja aze
elemet alista
i
. indexérelista.remove(e)
: törli alista
-ból aze
elem legelső előfordulásátlista.sort()
: rendezi alista
elemeit- helyben rendez, így az eredeti listát módosítja (ha ezt nem szeretnénk, akkor használhatjuk a
sorted(lista)
függvényt) - többféle adattípusra is működik: szövegeket tartalmazó listákat ábécé-sorrendbe, számokat tartalmazó listákat növekvő sorrendbe rendezi alapértelmezés szerint
- helyben rendez, így az eredeti listát módosítja (ha ezt nem szeretnénk, akkor használhatjuk a
lista.clear()
: kiüríti alista
-t.
Példa: Listakezelő függvények alkalmazása
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
Kimenet
['Thor', 'Hulk', 'Vízió', 'Thor', 'Hangya'] ['Vasember', 'Thor', 'Hulk', 'Vízió', 'Thor', 'Hangya'] ['Hangya', 'Hulk', 'Thor', 'Vasember', 'Vízió'] []
Kérdés
Láthatjuk, hogy a fenti kódban a remove()
függvény csak a legelső "Thor"-t törli a listából. Hogyan lehetne elérni, hogy a listában szereplő összes "Thor"-t töröljük?
Válasz
Használjunk while
ciklust! Amíg a "Thor"
elem szerepel a listánkban, addig mindig töröljünk ki egy előfordulást!
1 2 3 4 5 6 |
|
Kimenet
['Hulk', 'Vízió', 'Hangya', 'Vasember']
Szövegből lista, listából szöveg¶
A stringeknél láttuk, hogy egy szöveget könnyedén feldarabolhatunk a split()
metódussal egy adott karakter(sorozat) mentén. A metódus egy listával tér vissza, amiben a feldarabolás után kapott értékek szerepelnek.
Példa: Egy szöveg szavainak lekérdezése egy listában
1 2 3 4 |
|
Kimenet
['A', 'Python', 'egy', 'nagyon', 'klassz', 'nyelv!']
Most megnézzük a fordított irányt is. Ha egy lista elemeit szeretnénk egyesíteni egy adott karakter(sorozat) mentén, akkor a join()
függvényt használjuk.
Példa: Egy lista egyesítése szöveggé
1 2 3 4 5 |
|
Kimenet
alma citrom barack pomeló alma;citrom;barack;pomeló alma --- citrom --- barack --- pomeló
Dictionary¶
A dictionary (szótár) egy kulcs-érték párokat tartalmazó adatszerkezet, tulajdonképpen egy rendezetlen leképezés. Működését tekintve leginkább a Javából ismerős map-hez vagy a PHP-ban megismert asszociatív tömbhöz hasonlít.
Dictionary létrehozása¶
Pythonban egy dictionary-t létrehozhatunk...
- ...a
dict()
beépített függvénnyel (ez tulajdonképpen egy konstruktor) - ...a kulcs-érték párok kapcsos zárójelek közti felsorolásával.
A kulcsot, illetve az ahhoz tartozó értéket kulcs: érték
formában adjuk meg. Adott kulcs egy dictionary-ben csak egyszer szerepelhet, az értékre ilyen megkötés nincs.
- Egy dictionary-ben található kulcs bármi lehet, viszont a gyakorlatban általában string típusú kulcsokat használunk (ennek oka a JSON-formátummal való kompatibilitás).
- Egy dictionary-ben található érték tetszőleges típusú lehet (pl. logikai érték, szám, string, lista, dictionary, saját típus stb.).
Példa: Dictionary-k létrehozása
1 2 3 4 5 |
|
Dictionary hosszának lekérdezése¶
Egy dictionary hosszát (azaz a benne található kulcs-érték párok számát) jó barátunkkal, a len()
függvénnyel kérdezhetjük le.
1 2 |
|
Kimenet
3
Dictionary elemeinek elérése¶
Ha le szeretnénk kérdezni egy dictionary-ben egy adott kulcshoz tartozó értéket, akkor ezt Pythonban kétféleképpen tehetjük meg:
- hagyományos indexeléssel:
dictionary_neve[kulcs]
- a
get()
metódus segítségével:dictionary_neve.get(kulcs)
.
A lényegi különbség a két módszer között, hogy ha a kérdéses kulcs nem szerepel a dictionary-ben, akkor hagyományos indexeléssel hibát kapunk, míg get()
metódus használata esetén nem (ekkor a get()
metódus None
értékkel tér vissza).
Tipp
Ha úgy gondoljuk, hogy előfordulhat, hogy a kérdéses kulcs nem szerepel a dictionary-ben, akkor használjuk a get()
metódust a hagyományos indexelés helyett!
Példa: Dictionary elemeinek elérése
1 2 3 4 5 6 7 8 9 10 11 |
|
Kimenet
dobostorta dobostorta None
Műveletek dictionary-ken¶
Elem módosítása¶
A dictionary a listákhoz hasonlóan mutable (módosítható) adatszerkezet. Ha szeretnénk valamely kulcsához tartozó értéket módosítani, akkor ezt a szokásos indexelés-értékadás kombinációval tehetjük meg.
Példa: Módosítsuk a süteményünk nevét!
1 2 3 4 |
|
Kimenet
{'nev': 'gyümölcskrémes', 'szeletek': 12, 'elfogyott': False}
Új elem hozzáadása¶
Ha egy dictionary-be be szeretnénk szúrni egy új kulcs-érték párt, akkor egyszerűen csak megadjuk az új elem kulcsára az értéket: dictionary_neve[uj_kulcs] = uj_ertek
.
Példa: Tároljuk el a süti árát is a dictionary-ben!
1 2 3 4 |
|
Kimenet
A dobostorta ára: 5200 forint
Elem törlése¶
Ha egy dictionary-ből szeretnénk egy adott kulcsú elemet törölni, akkor használhatjuk a del dictionary_neve[kulcs]
szintaxist (ahol kulcs
értelemszerűen a kérdéses kulcs).
Példa: Nem számít, hány szeletes a süti. Töröljük ki a "szeletek" kulcsú elemet!
1 2 3 4 |
|
Kimenet
{'nev': 'dobostorta', 'elfogyott': False}
Kulcs előfordulásának ellenőrzése¶
A kulcs in dictionary_neve
kifejezéssel ellenőrizhetjük, hogy kulcs
szerepel-e a dictionary kulcsai között. Eredményül egy logikai értéket kapunk (igazat, ha szerepel a kulcs a dictionary-ben, hamisat, ha nem).
Példa: Ismerjük-e, hogy hány szeletes a süti?
1 2 3 4 5 6 |
|
Kimenet
A süteményünk 12 szeletes.
Próbáljuk ki a fenti kódot úgy is, hogy a suti
dictionary-ből töröljük a "szeletek"
kulcsú elemet még a feltételvizsgálat előtt!
Érték előfordulásának ellenőrzése¶
Ha nem a dictionary kulcsai, hanem értékei között keresünk, akkor az ertek in dictionary_neve.values()
szintaxist használjuk. Ez igazat ad vissza, ha az ertek
szerepel a dictionary értékei között, egyébként pedig hamisat.
1 2 3 4 |
|
Kimenet
Ma dobostortát eszünk.
Dictionary bejárása¶
Egy dictionary-t legegyszerűbben egy for
ciklussal járhatunk be. Lehetőségünk van csak külön a kulcsokat vagy csak külön az értékeket bejárnunk, illetve bejárhatjuk a kulcs-érték párokat egyszerre is. Járjuk be a fent létrehozott süti dictionary-t!
Kulcsok bejárása¶
1 2 3 4 |
|
Kimenet
nev szeletek elfogyott
Értékek bejárása¶
1 2 3 4 |
|
Kimenet
dobostorta 12 False
Kulcsok és értékek együttes bejárása¶
1 2 3 4 |
|
Kimenet
nev értéke: dobostorta szeletek értéke: 12 elfogyott értéke: False
A get()
metódus egy gyakorlati haszna¶
A korábbiakban láttuk a get()
metódus egyik főbb használatát: segítségével egy dictionary egy adott kulcsához tartozó értékét kérdezhetjük le. Most megnézzük egy másik gyakorlati hasznát ugyanennek a metódusnak.
A get()
metódust a gyakorlatban sokszor használják különböző aggregációk megvalósítására. Ilyenek lehetnek a különböző számlálással kapcsolatos feladatok vagy az alábbi példában bemutatott csoportosítási feladat.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
Ez a módszer leginkább akkor hasznos, ha az elemek vagy csoportok száma előre nem ismert, így folyamatosan kell létrehozni őket (pl. ha a felhasználótól vagy egyéb külső forrásból olvassuk be őket).
Egyéb adatszerkezetek¶
A listákon és a dictionary-ken kívül további hasznos adatszerkezetek is léteznek Pythonban.
A tuple egy rendezett "elem n-es", tulajdonképpen egy immutable lista (tehát a listával ellentétben az elemeit nem lehet módosítani). A listáknál tanultak többsége a tuple-nél is működik: az elemek indexelése, bejárása, előfordulás eldöntése ugyanúgy történik, mint a listáknál. A legtöbb listakezelő függvényt tuple esetén is használhatjuk, kivéve az append()
és sort()
metódusokat (ezek tuple-ök esetén nem működnek).
A halmaz (set) olyan adatszerkezet, amelyben nem lehetnek duplikátumok, és az elemek között nincs sorrendiség. Fontosabb metódusaira példát a linkre kattintva láthatunk.
Ez a két adatszerkezet az előadáson kerül tárgyalásra.
Feladatok¶
Az anyagrészhez tartozó gyakorló feladatsor elérhető itt.