Listák

2019.11.13

Dobás dobókockával

Derítsük ki, milyen gyakorisággal esnek az egyes számok egy dobókockán. Dobjunk a kockával legalább 1000-szer, és a kapott eredményt ábrázoljuk diagramon!

Egy ciklusban, amit 1000-szer ismétlünk, sorsolunk egy véletlen számot, majd a megfelelő mennyiséget növeljük (szam1, szam2, szam3, szam4, szam5, szam6 - ezekben változókban tárolnánk, melyik szám, hányszor esett).

Találunk elegánsabb megoldást?

Használhatnánk N-est is a mennyiségek feljegyzésére, viszont tudjuk, hogy annak az értékét változtatni nem lehet. Mindig új N-est kéne létrehoznunk szeletek segítségével. Ez a rész megintcsak nem elegáns.

Az N-eseken kívül léteznek más adatstruktúrák is. A listák (list) olyan adatstruktúrák, ahol az egyes elemek értékét gond nélkül lehet változtatni. A lista, hasonlóan az N-sekhez, különböző adatok sorozata, indexek segítségével könnyen hozzájuthatunk konkrét értékekhez, és azokat meg is tudjuk változtatni, nem kell új listát létrehozni.

Listát szögletes zárójelekkel hozhatunk létre:

Más programozási nyelvekben az ilyen adatstruktúrát array-nek (mező) hívják. A Pythonban is van array struktúra, ami tulajdonképpen egy speciális lista, mivel csak valós számokat tárolhatunk benne.

Az +, *, len(), a szeletelés (slice) és az indexelés tehát itt is működik. Ha a listán kívül próbálunk indexelni, akkor a Python hibajelentést ír ki: "IndexError: list index out of range" . 

A kockadobásokra tehát írhatunk egy ilyen programot:

Egyszerre három kockával dobunk. Készítsünk olyan programot, amely a dobott értékeket összeadja és fokozatosan minden dobás után kirajzol egy hisztogramot a dobott összegek gyakoriságáról.

Jelenleg a vászonunk nagysága előre meg van adva. Módosítsuk a programunkat úgy, hogy a dobások száma befolyásolja a vászon magasságát is. Feltételezzük, hogy a legmagasabb oszlop nem lesz nagyobb, mint a dobások számának ötöde. Ehhez jön még 50 pixel, hogy a feliratoknak is legyen helyük. Létrehozunk egy maxy nevű változót és a start() függvényben kiszámoljuk ennek az értékét (maxy = dobasok // 5 +50 ) - ez az érték lesz a vászon magassága is (canvas['heigth'] = maxy).

Megjegyzés: Hasonlóan változtathatjuk a vászon magasságát vagy a háttérszínét (canvas['width'] = 400, canvas['bg'] = 'red'). Ha az aktuális értékekhez szeretnénk hozzájutni, akkor azt kiírathatjuk (print(canvas['heigtht'])) vagy hozzárendelhetjük egy változóhoz (magassag = canvas['height'] (!!ez string típusú lesz).

Karakterláncok, rendezett n-esek és listák közös tulajdonságai

Indexelés - Egy konkrét elem, karakter... : valtozo[index}
Szeletelés (slice) - valtozo[mettől:meddig:lépés]
in művelet - elem in valtozo
len() függvény - hossz: len(valtozo)
+ művelet - összefűz két azonos típusú változót: a+b
* művelet - többször megismétli a változó elemeit egy új struktúrába: a*3
bejárás for ciklussal - for i in valtozo

Hasznos függvények és metódusok listákhoz

Ahogy a karakterláncnak és a rendezett n-es a listának is megvannak a saját metódusai, vagyis speciálisan felírt függvények: lista_neve.függvény(paraméter). A lista az előző két struktúrától eltérően változtatható típus, ez azt jelenti, hogy egyes függvények nem adnak vissza eredményt, hanem valamit megváltoztatnak a listában. Leggyakrabban ezeket a metódusokat fogjuk használni:

lista_neve.append(érték) - a lista végére hozzáadja az érték elemet.
lista_neve.insert(index, érték) - a megadott indexű helyre beszúrja az érték elemet.
lista_neve.pop() - eltávolítja az utolsó elemet a listából.
lista_neve.pop(0) - eltávolítja az első elemet a listából.
lista_neve.index(érték) - megkeresi az érték elem első előfordulását és visszaadja az indexszámát.
lista_neve.count(érték) - visszaadja, mennyi érték elem van a listában.
lista_neve.sort() - (emelkedő) sorrendbe rendezi az elemeket.

A következő két példában  (shellben) öt véletlen számból készítünk listát. Az elsőben az append() metódus segítségével.

A másodikban az append() helyett a már meglévő listához fűzünk hozzá fokazatosan újabb elemeket.

Hasonló eredményt érünk el, ha először létrehozunk egy listát öt darab nullával. Majd ezeket változtatjuk véletlen értékké.

Van amikor nem akarunk konkrét értékeket a listánkba. Ekkor használhatunk egy speciális, még nem definiált értéket, a None-t. Majd ezt módosítjuk.

Listát készíthetünk más struktúrából is (pl karakterláncból vagy tuple-ből) a list() eljárás segítségével.

Hasonlóan készíthetünk a listából tuple-t.

A list() eljárásban használhatjuk a range() utasítást, amelyet a for ciklusból ismerünk.

Szöveg szétbontása listába

Készítsünk programot, amely megkérdezi tőlünk, melyik európai fővárosokban jártunk már (szóközzel elválasztva adjuk meg őket), és kiírja a számukat és a városok neveit ábécé sorrendben.

A programban használtuk a sort() metódust, amely sorberendezi a lista elemeit.

Kérdések

1. Miért szükséges a # (1)* -es sor?
2. Milyen esetekben nem fog a program tökéletesen működni?
3. Hogyan lehetne ezeket a "hibákat" orvosolni?

A programunkban a cikus helyett, amely a szóköz megtalálása után a listánkhoz adja  a várost, használjatjuk a split() metódust. Ez a metódus a szöveget szétválasztja elemeire, és azokból listát hoz létre. Alapbelállításban a szóközöknél választja el az elemeket, de paraméterként megadhatunk más elváalsztókaraktert is.

szoveg.split(elválasztó)  -> pl. valasz.split(';')

A programunk ezzel a metódussal láthatóan rövidebb lett.

Listák használata programokban

© 2023 Minden jog fenntartva.
Az oldalt a Webnode működteti
Készítsd el weboldaladat ingyen! Ez a weboldal a Webnode segítségével készült. Készítsd el a sajátodat ingyenesen még ma! Kezdd el