Python gyerekeknek - adatszerkezetek

Kategória: Python gyerekeknek.

Idáig három adattípussal találkoztunk: szöveg, szám, logikai. Most megismerkedünk másik néggyel.

Lista

Elmélet

A lista alapvető fontosságú adatszerkezet, a Scratch-ben is benne van. Listát szögletes zárójelekbe írva ([…]) tudunk megadni:

fruits = ['alma', 'körte', 'szilva', 'barack']
print(fruits) # ['alma', 'körte', 'szilva', 'barack']

Scratch-ben a legegyszerűbb közvetlenül beírni az elemeket:

lista.png

A korábban megismert for ciklussal is végig tudunk lépni a lista elemein:

for fruit in fruits:
    print(fruit)

A len() utasítással meg tudjuk nézni a lista hosszát:

print(len(fruits)) # 4

Ennek a Scratch megfelelője:

listahossza.png

A lista adott sorszámú elemét szintén szögletes zárójellel tudjuk lekérdezni:

print(fruits[2]) # szilva

A már megszokott módon, a sorszámozás 0-tól indul. Scratch-ben a sorszámozás 1-től történik, így a fentinek megfelelő utasítás:

listaeleme.png

Ugyancsak a fenti módon megcímezve meg is tudunk változtatni egy elemet:

fruits[1] = 'narancs'
print(fruits) # ['alma', 'narancs', 'szilva', 'barack', 'mandarin']

Scratch-ben ugyanez:

listacsere.png

Az append() művelettel tudunk hozzátenni elemet:

fruits.append('mandarin')
print(fruits) # ['alma', 'narancs', 'barack', 'mandarin']
listahozzaad.png

Az in művelettel le tudjuk kérdezni, hogy egy elem benne van-e a listában:

if 'barack' in fruits:
    print('A barack benne van a gyümölcsök listájában.')
else:
    print('A barack nincs benne a gyümölcsök listájában.')

Scratch-ben:

listatartalmazza.png

Törölni tudunk elem és index alapján is:

fruits.remove('barack')
print(fruits) # ['alma', 'narancs', 'szilva', 'mandarin']
fruits.pop(0)
print(fruits) # ['narancs', 'szilva', 'mandarin']

Scratch-ben először le kell kérdezni az adott elem sorszámát (ez Pythonban is így van, de ott automatikusan történik):

listaelemtorles.png

Törlés sorszám alapján Scratch-ben:

listaindextorles.png

Egy másik listát az extend() művelettel tudunk hozzáadni:

fruits.extend(['szilva', 'meggy', 'cseresznye'])
print(fruits) # ['narancs', 'szilva', 'mandarin', 'szilva', 'meggy', 'cseresznye']

Ennek megfelelő művelet nincs a Scratch-ben, ott egy ciklus segítségével kell egyesével hozzáadni az elemeket.

A sort() művelettel tudjuk az elemeket rendezni:

fruits.sort()
print(fruits) # ['cseresznye', 'mandarin', 'meggy', 'narancs', 'szilva', 'szilva']

Scratch-ben sem tudunk rendezni; a rendezést ott nekünk kell megvalósítanunk.

A clear() művelettel tudjuk törölni az elemeket:

fruits.clear()
print(fruits) # []

Scratch-ben:

listamindentorles.png

Feladat

A kvíz játékot készítsük el ciklus és lista segítségével! Ne legyen benne kódismétlés!

points = 0
questions = [
    'Mi Magyarország fővárosa? ',
    'Hány fokon forr a víz? ',
    'Melyik az az állat, amelyiknek nagy füle és hosszú ormánya van? ',
    'Hogy mondjuk angolul azt, hogy alma? ',
    'Mi volt Petőfi vezetéknevű költőnk keresztneve? ',
]
answers = [
    'Budapest',
    '100',
    'elefánt',
    'apple',
    'Sándor',
]
 
for i in range(len(questions)):
    answer = input(questions[i])
    if answer == answers[i]:
        print('Helyes!')
        points = points + 1
    else:
        print('A válasz helytelen; a helyes válasz ' +  answers[i] + ' lett volna.')
    print()
 
percentage = str(100 * points / 5) + '%'
print('Az eredmény: ' + percentage)

Önálló feladat

A különböző nehézségű feladatok érjenek eltérő pontszámot!

Teszt

TODO

Tuple

Speciális listaként felfoghatjuk az ún. tuple adatszerkezetet. Ez lényegében egy olyan lista, amit nem lehet megváltoztatni. A lekérdező műveletek tehát működnek, de a megváltoztatók (pl. elem hozzáadása, törlése, rendezése stb.) nem.

Az adatokat itt kerek zárójelben kell megadnunk:

fruits = ('alma', 'körte', 'szilva', 'barack')

A sorszám alapján történő lekérdezés ugyanaz, mint az igazi listáknál:

print(fruits[2]) # szilva

Viszont a módosítási kísérlet hibát eredményez:

fruits[1] = 'narancs' # TypeError

A fenti példában az elemek mind szavak voltak. Lehetett volna más is, pl. szám, vagy akár másik lista. A típusok vegyíthetőek is. Lista esetén nem célszerű vegyíteni, a tuple viszont alapvetően arra lett kitalálva, hogy vegyítsük.

Halmaz

Elmélet

A halmaz hasonló a listához, viszont van néhány lényeges eltérés:

  • A halmazban egy elem csak egyszer szerepelhet, míg a listában akárhányszor.
  • A halmazban az elemek sorrendje nem adott, így a szögletes zárójeles lekérdező műveletek sem működnek. (De a for ciklus igen.)

Halmaz a Scratch-ben nincs.

A halmazt kapcsos zárójelekkel ({…}) adhatjuk meg:

fruits1 = {'alma', 'körte', 'szilva', 'barack', 'alma'}
fruits2 = {'meggy', 'szilva', 'alma', 'cseresznye'}
print(fruits1) # {'körte', 'szilva', 'barack', 'alma'}
print(fruits2) # {'meggy', 'szilva', 'alma', 'cseresznye'}

Vegyük észre az alábbiakat:

  • A fruits1 halmazba két almát tettünk, de a listában már csak egy van.
  • A kiírás sorrendje eltér a megadás sorrendjétől.

Elemeket hozzáadni ill. törölni érték szerint az add() ill. remove() eljárásokkal tudunk:

fruits1.add('meggy')
fruits1.remove('szilva')
print(fruits1) # {'alma', 'körte', 'barack', 'meggy'}

A halmaz elemszámát a len() eljárással tudjuk lekérdezni:

print(len(fruits1)) # 4

A szokásos halmazműveleteket (unió, metszet, különbség, szimmetrikus különbség) végre tudjuk hajtani:

print(fruits1.union(fruits2)) # {'alma', 'körte', 'barack', 'cseresznye', 'meggy', 'szilva'}
print(fruits1.intersection(fruits2)) # {'meggy', 'alma'}
print(fruits1.difference(fruits2)) # {'körte', 'barack'}
print(fruits1.symmetric_difference(fruits2)) # {'körte', 'barack', 'cseresznye', 'szilva'}

A gyakorlatban persze általában nem kiírjuk, hanem értékül adjuk más változónak, amit tovább feldolgozunk.

Feladat

Készítsünk egy olyan programot, amely bekéri a 7 törpe neveit. Addig kéri, amíg mindet helyesen be nem írtuk. A feladatot halmazokkal oldjuk meg!

dwarfs = {"Tudor", "Vidor", "Morgó", "Szundi", "Szende", "Hapci", "Kuka"}
input_dwarfs = set()
while True:
    dwarf = input('Törpe neve: ')
    if dwarf in dwarfs:
        if dwarf in input_dwarfs:            
            print('Helyes, de már benne van.')
        else:
            print('Helyes')
    else:
        print('Helytelen!')
    input_dwarfs.add(dwarf)
    print('Eddig beírt törpék: ' + str(input_dwarfs))
    intersection = dwarfs.intersection(input_dwarfs)
    print('Ebből helyesen beírtak: ' + str(intersection))
    if intersection == dwarfs:
        print('Gratulálok, sikeresen beírtad mind!')
        break

Önálló feladat

Kérje be a hét napjait. Számolja a pontokat a következőképpen: minden helyes válasz 5 pont, a helytelen -2, és ha olyat írt be, ami már benne volt, akkor -1. A végén írja ki a pontszámot.

Extra: ha azt írja be, hogy "help", akkor kiír egy segítséget, de 5 pontot levon.

Teszt

TODO

Szótár

Elmélet

A szótárban kulcs-érték párok találhatóak. Angolul a szótár dictionary, emiatt az elnevezése a Pythonban dict. Scratch-ben ilnyen adatszerkezet nincs. Kapcsos zárójelek segítségével adjuk meg az elemeket, amelyek kettősponttal elválasztott kulcs-érték párok, vesszővel felsorolva, pl:

dictionary = {
    'alma': 'apple',
    'szilva': 'plum',
    'körte': 'pear',
    'barack': 'peach',
}

Érdemes megfigyelni azt, hogy az utolsó elem után is van vessző. Ez nem kötelező, viszont egy hasznos lehetőség a Pythonban.

Lekérdezni szögletes zárójellel tudunk, ahol itt nem a sorszámot adjuk meg, hanem a kulcsot:

print(dictionary['alma']) # apple

Hasonló módon tudunk új elemet felvenni, ill. egy létezőt megváltoztatni:

dictionary['cseresznye'] = 'cherry'

Feladat

Készítsük el a kvíz szótáras változatát! Ez amiatt

points = 0
question_answer_dict = {
    'Mi Magyarország fővárosa? ': 'Budapest',
    'Hány fokon forr a víz? ': '100',
    'Melyik az az állat, amelyiknek nagy füle és hosszú ormánya van? ': 'elefánt',
    'Hogy mondjuk angolul azt, hogy alma? ': 'apple',
    'Mi volt Petőfi vezetéknevű költőnk keresztneve? ': 'Sándor',
}
 
for question in question_answer_dict:
    answer = input(question)
    correct_answer = question_answer_dict[question]
    if answer == correct_answer:
        print('Helyes!')
        points = points + 1
    else:
        print(f'A válasz helytelen; a helyes válasz {correct_answer} lett volna.')
    print()
 
percentage = str(100 * points / len(question_answer_dict)) + '%'
print('Az eredmény: ' + percentage)

Önálló feladat

A megoldás ne szöveg, hanem szám legyen, és az eltéréseket számolja.

Teszt

TODO

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License