Python adatszerkezet gyűjtemény: lista, tuple, dictionary

A Python, a világ egyik legnépszerűbb programozási nyelve, rendkívüli rugalmasságáról és olvashatóságáról ismert. Ennek az erejének egyik kulcsa a beépített adatszerkezetek gazdag tárháza, amelyek lehetővé teszik számunkra, hogy hatékonyan tároljuk, rendezzük és manipuláljuk az adatokat. Akár kezdő fejlesztő vagy, akár tapasztalt profi, ezen alapvető építőkövek megértése elengedhetetlen a tiszta, hatékony és karbantartható kód írásához.

Ebben a részletes útmutatóban három alapvető Python adatszerkezetet – a listát, a tuple-t és a dictionary-t – fogunk megvizsgálni. Megtudhatod, mi teszi őket egyedivé, hogyan használd őket a mindennapi programozásban, és mikor melyiket érdemes választani a különböző problémák megoldására. Készülj fel, hogy mélyre merülj a Python adatkezelésének izgalmas világába!

Miért olyan fontosak az adatszerkezetek?

Az adatszerkezetek a programozás alapkövei. Elképzelhetjük őket úgy, mint speciálisan kialakított tárolókat, amelyekben az adatokat tároljuk. A megfelelő adatszerkezet kiválasztása nem csak a kód olvashatóságát és karbantarthatóságát javítja, hanem alapvetően befolyásolhatja a program teljesítményét is. A Python beépített adatszerkezetei optimalizáltak a sebességre és a memóriahatékony működésre, így ideálisak a legtöbb programozási feladathoz.

A Python lista: A sokoldalú és módosítható gyűjtemény

A lista talán a leggyakrabban használt és legrugalmasabb beépített adatszerkezet a Pythonban. Olyan elemek rendezett gyűjteménye, amelyek bármilyen típusúak lehetnek (egész számok, stringek, lebegőpontos számok, sőt, akár más listák is), és a lista létrehozása után az elemek módosíthatók, hozzáadhatók vagy eltávolíthatók. Ezt a tulajdonságát nevezzük mutabilitásnak.

A lista jellemzői:

  • Rendezett: Az elemeknek van egy meghatározott sorrendje, és ezt a sorrendet megőrzik. A hozzárendelt indexek (0-tól kezdve) segítségével érhetjük el őket.
  • Módosítható (Mutable): Az elemeket a létrehozás után módosíthatjuk, hozzáadhatunk vagy eltávolíthatunk belőlük.
  • Ismétlődő elemek: Tartalmazhat azonos értékű elemeket.
  • Heterogén: Különböző adattípusú elemeket is tárolhat egyszerre.

Lista létrehozása:

Listát szögletes zárójelek ([]) között vesszővel elválasztva hozhatunk létre, vagy a list() konstruktorral:


# Üres lista
ures_lista = []
print(f"Üres lista: {ures_lista}")

# Számok listája
szamok = [1, 2, 3, 4, 5]
print(f"Számok: {szamok}")

# Stringek listája
gyumolcsok = ["alma", "körte", "szilva"]
print(f"Gyümölcsök: {gyumolcsok}")

# Vegyes típusú lista
vegyes_lista = [1, "hello", 3.14, True]
print(f"Vegyes lista: {vegyes_lista}")

# Lista a listán belül (beágyazott lista)
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
print(f"Mátrix: {matrix}")

# Listából a list() konstruktorral
nev_lista = list("Python") # ['P', 'y', 't', 'h', 'o', 'n']
print(f"Név lista: {nev_lista}")

Gyakori lista műveletek:

Elemek elérése (indexelés és szeletelés):

Az elemeket indexük alapján (0-tól kezdődően) érhetjük el. Negatív indexekkel a lista végétől visszafelé számolhatunk.


szamok = [10, 20, 30, 40, 50]
print(f"Első elem: {szamok[0]}")  # 10
print(f"Utolsó elem: {szamok[-1]}") # 50

# Szeletelés: [start:stop:step]
print(f"Első három elem: {szamok[0:3]}") # [10, 20, 30]
print(f"Utolsó két elem: {szamok[3:]}") # [40, 50]
print(f"Minden elem kétlépésenként: {szamok[::2]}") # [10, 30, 50]

Elemek módosítása:

Mivel a listák módosíthatók, az indexelés segítségével felülírhatunk elemeket:


gyumolcsok = ["alma", "körte", "szilva"]
gyumolcsok[1] = "banán"
print(f"Módosított gyümölcsök: {gyumolcsok}") # ['alma', 'banán', 'szilva']

Elemek hozzáadása:

  • append(): Egy elemet ad hozzá a lista végéhez.
  • insert(index, elem): Egy elemet szúr be a megadott indexre.
  • extend(iterable): Egy másik iterálható (pl. lista) összes elemét hozzáadja a lista végéhez.

szamok = [1, 2, 3]
szamok.append(4)
print(f"Append után: {szamok}") # [1, 2, 3, 4]

szamok.insert(1, 1.5)
print(f"Insert után: {szamok}") # [1, 1.5, 2, 3, 4]

uj_szamok = [5, 6]
szamok.extend(uj_szamok)
print(f"Extend után: {szamok}") # [1, 1.5, 2, 3, 4, 5, 6]

Elemek eltávolítása:

  • remove(elem): Eltávolítja az első előfordulását a megadott értékű elemnek. Hiba, ha az elem nincs a listában.
  • pop(index): Eltávolítja és visszaadja a megadott indexen lévő elemet. Ha nincs megadva index, az utolsó elemet távolítja el.
  • del kulcsszó: Eltávolít elemeket index vagy szeletelés alapján.
  • clear(): Eltávolítja a lista összes elemét.

szamok = [10, 20, 30, 20, 40]
szamok.remove(20) # Az első 20-ast távolítja el
print(f"Remove után: {szamok}") # [10, 30, 20, 40]

eltavolitott_elem = szamok.pop(1) # A 30-ast távolítja el (index 1)
print(f"Pop után: {szamok}, eltávolított: {eltavolitott_elem}") # [10, 20, 40], eltávolított: 30

del szamok[0] # Eltávolítja a 10-est
print(f"Del index után: {szamok}") # [20, 40]

del szamok[0:1] # Eltávolítja a 20-ast (szeletelés)
print(f"Del szeletelés után: {szamok}") # [40]

szamok.clear()
print(f"Clear után: {szamok}") # []

Egyéb hasznos lista metódusok:

  • len(): Visszaadja a lista hosszát.
  • sort(): Rendezi a listát (helyben módosítja).
  • sorted(): Visszaadja a rendezett lista egy új másolatát.
  • reverse(): Megfordítja a lista elemeinek sorrendjét (helyben).
  • count(elem): Megszámolja egy elem előfordulásait.
  • index(elem): Visszaadja egy elem első előfordulásának indexét.

szamok = [3, 1, 4, 1, 5, 9, 2, 6]
print(f"Hossz: {len(szamok)}") # 8

szamok.sort()
print(f"Rendezett lista (sort): {szamok}") # [1, 1, 2, 3, 4, 5, 6, 9]

rendezett_uj_lista = sorted([9, 8, 7])
print(f"Rendezett új lista (sorted): {rendezett_uj_lista}") # [7, 8, 9]

szamok.reverse()
print(f"Fordított lista: {szamok}") # [9, 6, 5, 4, 3, 2, 1, 1]

print(f"Az 1-es szám előfordulásai: {szamok.count(1)}") # 2
print(f"A 9-es szám indexe: {szamok.index(9)}") # 0

Mikor használjunk listát?

Listát akkor érdemes használni, ha:

  • Rendezett adatok gyűjteményét kell tárolni.
  • Az elemek számát vagy értékét gyakran kell módosítani (hozzáadás, eltávolítás, frissítés).
  • Nem homogén adattípusokat szeretnénk tárolni egy gyűjteményben.

A Python tuple: Az állandó adatok őre

A tuple (kiejtve: tápl) a lista „nem módosítható” (immutable) megfelelője. Jelentős különbség, hogy miután egy tuple-t létrehoztunk, az elemei nem módosíthatók, nem adhatók hozzá újak és nem távolíthatók el régiek. Ez a tulajdonság a tuple-t rendkívül hasznossá teszi olyan adatok tárolására, amelyeknek állandóknak kell lenniük.

A tuple jellemzői:

  • Rendezett: Akárcsak a listák, a tuple-ök is megőrzik az elemek sorrendjét, és indexek alapján érhetők el.
  • Nem módosítható (Immutable): A létrehozás után nem változtatható. Ez a legfontosabb különbség a listától.
  • Ismétlődő elemek: Tartalmazhat azonos értékű elemeket.
  • Heterogén: Különböző adattípusú elemeket is tárolhat egyszerre.

Tuple létrehozása:

Tuple-t kerek zárójelek (()) között vesszővel elválasztva hozhatunk létre, vagy a tuple() konstruktorral. Egyetlen elemet tartalmazó tuple létrehozásakor fontos, hogy az elem után vesszőt tegyünk, különben a Python egyszerűen csak az elem típusaként értelmezi.


# Üres tuple
ures_tuple = ()
print(f"Üres tuple: {ures_tuple}")

# Számok tuple-je
koordinatak = (10, 20)
print(f"Koordináták: {koordinatak}")

# Stringek tuple-je
napok = ("hétfő", "kedd", "szerda")
print(f"Napok: {napok}")

# Vegyes típusú tuple
adatok = ("Péter", 30, True)
print(f"Adatok: {adatok}")

# Egyelemes tuple (fontos a vessző!)
egy_elem = (42,)
print(f"Egy elemes tuple: {egy_elem}, típusa: {type(egy_elem)}") # (42,), típusa: 

# Nem tuple (egyszerűen egy int)
nem_tuple = (42)
print(f"Nem tuple: {nem_tuple}, típusa: {type(nem_tuple)}") # 42, típusa: 

# Tuple a tuple() konstruktorral
betuk = tuple("ABC") # ('A', 'B', 'C')
print(f"Betűk tuple: {betuk}")

Gyakori tuple műveletek:

Elemek elérése (indexelés és szeletelés):

Akárcsak a listáknál, az indexelés és szeletelés ugyanúgy működik a tuple-ök esetén is.


koordinatak = (100, 200, 300)
print(f"Első koordináta: {koordinatak[0]}") # 100
print(f"Utolsó koordináta: {koordinatak[-1]}") # 300
print(f"Szeletelés: {koordinatak[0:2]}") # (100, 200)

Tuple-ök összefűzése (konkatenáció):

Két tuple-t összeadhatunk a + operátorral, ami egy új tuple-t eredményez.


tuple1 = (1, 2)
tuple2 = (3, 4)
osszevont_tuple = tuple1 + tuple2
print(f"Összevont tuple: {osszevont_tuple}") # (1, 2, 3, 4)

Tuple kicsomagolása (unpacking):

Ez egy nagyon hasznos funkció, amellyel egy tuple elemeit közvetlenül hozzárendelhetjük változókhoz, feltéve, hogy a változók száma megegyezik a tuple elemeinek számával.


pont = (5, 10)
x, y = pont
print(f"X koordináta: {x}, Y koordináta: {y}") # X koordináta: 5, Y koordináta: 10

nev, kor, aktiv = ("Anna", 28, True)
print(f"Név: {nev}, Kor: {kor}, Aktív: {aktiv}")

Miért immutable (nem módosítható)?

A tuple-ök immutabilitása több előnnyel is jár:

  • Adatintegritás: Biztosítja, hogy az adatok véletlenül se módosuljanak, miután beállítottuk őket. Ideális konfigurációs beállítások, állandó adatok tárolására.
  • Teljesítmény: Mivel a Python tudja, hogy a tuple elemei nem változnak, bizonyos optimalizálásokat hajthat végre, ami gyorsabbá teheti a műveleteket.
  • Dictionary kulcsként használható: Az immutable objektumok (mint a stringek, számok és tuple-ök) használhatók dictionary kulcsként, míg a mutable objektumok (mint a listák) nem. Ez azért van, mert a kulcsoknak hash-elhetőnek kell lenniük.

Mikor használjunk tuple-t?

Tuple-t akkor érdemes használni, ha:

  • Olyan adatok gyűjteményét kell tárolni, amelyeknek állandóknak kell lenniük (pl. dátumok, koordináták, színkódok).
  • Függvényekből több értéket szeretnénk visszaadni.
  • Adatokat szeretnénk tárolni, amelyeket dictionary kulcsként is felhasználnánk.
  • A kódunk biztonságosabb és hibatűrőbb lesz, ha tudjuk, hogy az adatok nem fognak véletlenül módosulni.

A Python dictionary: A kulcs-érték párok nagymestere

A dictionary (magyarul szótár) egy rendkívül erőteljes és sokoldalú adatszerkezet a Pythonban, amely kulcs-érték párok gyűjteményét tárolja. Gondoljunk rá úgy, mint egy igazi szótárra, ahol minden szó (kulcs) egy meghatározáshoz (értékhez) van rendelve. A dictionary-k a kulcsok alapján teszik lehetővé az értékek rendkívül gyors elérését.

A dictionary jellemzői:

  • Rendezett (Python 3.7+): A Python 3.7-től kezdve a dictionary-k megőrzik a beillesztés sorrendjét. Korábbi verziókban rendezetlenek voltak.
  • Módosítható (Mutable): A létrehozás után új kulcs-érték párokat adhatunk hozzá, módosíthatunk vagy eltávolíthatunk meglévőket.
  • Egyedi kulcsok: Minden kulcsnak egyedinek kell lennie a dictionary-n belül. Ha egy létező kulccsal próbálunk értéket hozzárendelni, az felülírja a korábbi értéket.
  • Immutable kulcsok: A kulcsoknak immutábilis típusoknak kell lenniük (pl. stringek, számok, tuple-ök). A mutable típusok (pl. listák) nem használhatók kulcsként.
  • Heterogén: Az értékek és a kulcsok is lehetnek különböző adattípusúak.

Dictionary létrehozása:

Dictionary-t kapcsos zárójelek ({}) között kulcs-érték párokkal (kulcs: érték formában) vesszővel elválasztva hozhatunk létre, vagy a dict() konstruktorral.


# Üres dictionary
ures_szotar = {}
print(f"Üres szótár: {ures_szotar}")

# Egyszerű dictionary
felhasznalo = {
    "nev": "Kiss Petra",
    "kor": 30,
    "varos": "Budapest"
}
print(f"Felhasználó: {felhasznalo}")

# Másik példa
termek = {
    "azonosito": "T001",
    "nev": "Laptop",
    "ar": 1200.50,
    "raktaron": True
}
print(f"Termék: {termek}")

# Dictionary a dict() konstruktorral (kulcsszavas argumentumokból)
auto = dict(marka="Opel", modell="Corsa", evjarat=2018)
print(f"Autó: {auto}")

# Dictionary a dict() konstruktorral (tuple listából)
szamok_szotar = dict([(1, "egy"), (2, "kettő")])
print(f"Számok szótár: {szamok_szotar}")

Gyakori dictionary műveletek:

Értékek elérése:

Az értékeket a hozzájuk tartozó kulcsok segítségével érhetjük el, szögletes zárójelek ([]) vagy a get() metódus használatával.


felhasznalo = {
    "nev": "Kiss Petra",
    "kor": 30,
    "varos": "Budapest"
}

print(f"Felhasználó neve: {felhasznalo['nev']}") # Kiss Petra
print(f"Felhasználó kora: {felhasznalo.get('kor')}") # 30

# Különbség a [] és a get() között:
# A [] hibát dob (KeyError), ha a kulcs nem létezik.
# A get() None-t ad vissza, ha a kulcs nem létezik, vagy egy általunk megadott alapértelmezett értéket.
print(f"Nem létező kulcs (get): {felhasznalo.get('email', 'Nincs megadva')}") # Nincs megadva
# print(felhasznalo['email']) # KeyError: 'email'

Elemek hozzáadása és módosítása:

Új kulcs-érték párokat adhatunk hozzá, vagy meglévőket módosíthatunk a kulcsra való hivatkozással és érték hozzárendelésével.


felhasznalo = {
    "nev": "Kiss Petra",
    "kor": 30,
    "varos": "Budapest"
}

felhasznalo["email"] = "[email protected]" # Új elem hozzáadása
print(f"Email hozzáadva: {felhasznalo}")

felhasznalo["kor"] = 31 # Meglévő elem módosítása
print(f"Kor módosítva: {felhasznalo}")

Elemek eltávolítása:

  • del kulcsszó: Eltávolít egy kulcs-érték párt. Hiba, ha a kulcs nem létezik.
  • pop(kulcs): Eltávolítja és visszaadja a megadott kulcshoz tartozó értéket.
  • popitem(): Eltávolítja és visszaadja az utoljára hozzáadott kulcs-érték párt (Python 3.7+).
  • clear(): Eltávolítja a dictionary összes elemét.

felhasznalo = {
    "nev": "Kiss Petra",
    "kor": 30,
    "varos": "Budapest",
    "email": "[email protected]"
}

del felhasznalo["varos"]
print(f"Város törölve (del): {felhasznalo}")

eltavolitott_email = felhasznalo.pop("email")
print(f"Email törölve (pop): {felhasznalo}, eltávolított: {eltavolitott_email}")

felhasznalo["hobby"] = "olvasás" # Hozzáadunk egy elemet a popitem() teszteléséhez
print(f"Hobby hozzáadva: {felhasznalo}")
eltavolitott_pair = felhasznalo.popitem()
print(f"Utolsó elem törölve (popitem): {felhasznalo}, eltávolított: {eltavolitott_pair}")

felhasznalo.clear()
print(f"Szótár ürítve (clear): {felhasznalo}")

Iterálás dictionary-n:

A dictionary-n többféleképpen is iterálhatunk:

  • Alapértelmezetten a kulcsokon iterál.
  • keys(): Visszaadja a kulcsok nézetét.
  • values(): Visszaadja az értékek nézetét.
  • items(): Visszaadja a kulcs-érték párok nézetét tuple-ök listájaként.

termek = {
    "azonosito": "T001",
    "nev": "Laptop",
    "ar": 1200.50
}

# Kulcsokon iterálás
print("Kulcsok:")
for kulcs in termek:
    print(kulcs)

# Értékeken iterálás
print("nÉrtékek:")
for ertek in termek.values():
    print(ertek)

# Kulcs-érték párokon iterálás
print("nKulcs-érték párok:")
for kulcs, ertek in termek.items():
    print(f"{kulcs}: {ertek}")

Mikor használjunk dictionary-t?

Dictionary-t akkor érdemes használni, ha:

  • Olyan adatokat kell tárolni, ahol az értékekhez egyedi azonosító (kulcs) tartozik, és ezen kulcsok alapján szeretnénk gyorsan hozzáférni az adatokhoz.
  • Konfigurációs fájlokat vagy beállításokat kezelünk.
  • Adatbázisrekordokat vagy JSON-objektumokat reprezentálunk.
  • Gyakran van szükségünk gyors keresésre és adatok lekérdezésére.

Mikor melyiket válasszuk? Döntési segédlet

A három adatszerkezet – lista, tuple és dictionary – mindegyike egyedi erősségekkel rendelkezik, és a választás a konkrét probléma függvénye. Íme egy gyors útmutató:

  • Lista:
    • Használd, ha: Az elemek sorrendje fontos, és gyakran kell elemeket hozzáadni, eltávolítani vagy módosítani. Ideális változó méretű kollekciókhoz, például egy felhasználó bevásárlókosarához, feladatlistához.
    • Ne használd, ha: Az adatoknak állandóaknak kell lenniük, és nem szabadna megváltozniuk.
  • Tuple:
    • Használd, ha: Az adatok sorrendje fontos, de az elemeknek állandóaknak (immutable) kell lenniük. Kiváló fix méretű rekordokhoz, például koordinátákhoz (x, y), RGB színkódokhoz, vagy olyan adatokhoz, amelyek nem változhatnak a program futása során. Használható dictionary kulcsként is.
    • Ne használd, ha: Gyakori módosításokra van szükség az elemekben.
  • Dictionary:
    • Használd, ha: Az adatok kulcs-érték párok formájában léteznek, és a kulcsok alapján szeretnénk gyorsan elérni az értékeket. Kiváló rekordok (pl. felhasználói profilok), konfigurációs adatok vagy olyan adatok tárolására, ahol egyedi azonosítók alapján keresünk.
    • Ne használd, ha: Az elemek sorrendje az elsődleges szempont, és nincs egyedi kulcs az adatokhoz.

Gyakori hibák és tippek

  • Tuple módosítása: Ne próbáljunk meg tuple elemeket módosítani. Ha változtatásra van szükség, alakítsuk listává, módosítsuk, majd vissza tuple-re (ha szükséges), vagy hozzunk létre egy új tuple-t.
  • Dictionary kulcsok: Ne felejtsük el, hogy a dictionary kulcsoknak egyedieknek és immutable-nek kell lenniük. Ha mutable objektumot használunk kulcsként, a Python hibát dob.
  • Méret és teljesítmény: Bár mindhárom adatszerkezet rendkívül hatékony, nagy adathalmazok esetén érdemes figyelembe venni az egyes műveletek időkomplexitását. A dictionary kulcs alapú keresése általában O(1) időben történik, ami rendkívül gyors.

Összefoglalás

A Python lista, tuple és dictionary a programozás alapvető építőkövei. A listák rugalmas, módosítható gyűjtemények, ideálisak változó adathalmazokhoz. A tuple-ök rendezett, nem módosítható struktúrák, melyek adatintegritást és teljesítményt biztosítanak állandó adatok esetén. A dictionary-k pedig a kulcs-érték párok mesterei, kiválóak gyors lekérdezésekhez és strukturált adatok tárolásához. Ezen adatszerkezetek alapos ismerete képessé tesz arra, hogy tiszta, hatékony és elegáns Python kódot írj, és hatékonyan oldd meg a legkülönfélébb programozási feladatokat.

Reméljük, hogy ez az átfogó útmutató segített jobban megérteni ezeket az alapvető Python eszközöket, és magabiztosabban alkalmazod majd őket a jövőbeli projektjeidben!

Leave a Reply

Az e-mail címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük