11. További algoritmusok
A korábbi fejezetekben megtanultuk a legalapvetőbb programozási tételeket, mint például az összegzést vagy a legnagyobb elem kiválasztását. Ahogy azonban a programjaink okosodnak, egyre bonyolultabb adatműveletekre lesz szükségünk.
Ebben a fejezetben megnézzük, hogyan tudunk listákat szűrni, kettéosztani, vagy éppen saját magunk sorba rendezni az elemeiket a beépített parancsok használata nélkül.
11.1. Kiválogatás algoritmusa
A probléma: Van egy nagy listánk, és szeretnénk belőle kigyűjteni egy új listába csak azokat az elemeket, amelyek megfelelnek egy bizonyos feltételnek (például csak a páros számokat, vagy csak az átment diákokat).
A megoldás logikája: Létrehozunk egy üres listát a "nyerteseknek". Egy ciklussal végigmegyünk az eredeti listán, és ha az aktuális elem megfelel a feltételnek (igaz az if ág), akkor az .append() metódussal hozzáfűzzük az új listához.
szamok = [12, 5, 8, 21, 14, 7, 30]
# Ide fogjuk gyűjteni azokat, amik nagyobbak 10-nél
nagyobb_mint_tiz = []
for szam in szamok:
if szam > 10:
nagyobb_mint_tiz.append(szam) # Ha igaz, betesszük az új listába!
print(f"Az eredeti lista: {szamok}")
print(f"A 10-nél nagyobbak: {nagyobb_mint_tiz}")
11.2. Szétválogatás algoritmusa
A probléma: A listánkat két külön csoportra szeretnénk osztani egy feltétel alapján (például fiúkra és lányokra, vagy pozitív és negatív számokra). Senki sem maradhat ki, de mindenki csak egy helyre kerülhet.
A megoldás logikája: Két darab üres listát hozunk létre. A ciklusban egy if-else szerkezet segítségével döntjük el, hogy az adott elem az első, vagy a második listába kerüljön-e.
jegyek = [4, 2, 5, 1, 3, 5, 2]
atmentek = []
megbuktak = []
for jegy in jegyek:
if jegy > 1:
atmentek.append(jegy)
else:
megbuktak.append(jegy)
print(f"Sikeres vizsgát tettek (jegyek): {atmentek}")
print(f"Pótvizsgázók (jegyek): {megbuktak}")
11.3. Metszet algoritmusa (Közös elemek)
A probléma: Van két külön listánk, és arra vagyunk kíváncsiak, hogy mik azok az elemek, amik mind a kettőben benne vannak (pl. ki az, aki focizik ÉS kosarazik is).
A megoldás logikája: Egy harmadik, üres listába fogunk gyűjtögetni. Végigmegyünk az első listán, és az in kulcsszó (benne van-e) segítségével megvizsgáljuk, hogy az aktuális elem szerepel-e a második listában is.
fociznak = ["Peti", "Anna", "Gergő", "Zoli"]
kosaraznak = ["Zoli", "Kata", "Peti", "Bence"]
# Ide kerülnek a közös elemek
mindkettot_jatsszak = []
for nev in fociznak:
if nev in kosaraznak: # Ha a focista neve benne van a kosarasok között is
mindkettot_jatsszak.append(nev)
print(f"Aki focizik és kosarazik is: {mindkettot_jatsszak}")
set) segítségével ez a művelet a Pythonban egyetlen sorral megolható lenne, de itt most a háttérben húzódó logikát gyakoroljuk!)
11.4. Rendezés algoritmusa (Buborékrendezés)
A probléma: Sorba szeretnénk rendezni egy lista elemeit (pl. növekvő sorrendbe), de a .sort() metódus használata nélkül, hogy megértsük, hogyan dolgozik a gép.
A megoldás logikája: A legklasszikusabb algoritmus erre a Buborékrendezés. A lényege, hogy párosával összehasonlítjuk az egymás mellett lévő elemeket. Ha rossz sorrendben vannak, megcseréljük őket. Ezt addig ismételjük a listán, amíg az összes elem (mint a buborékok a vízben) a megfelelő helyre nem "száll". Mivel ehhez többször is végig kell menni a listán, két egymásba ágyazott ciklust használunk.
Python trükk (Csere): Két változó értékét a Pythonban rendkívül elegánsan, egyetlen sorban fel lehet cserélni így:
a, b = b, a!
szamok = [8, 3, 12, 2, 5]
# A külső ciklus annyiszor fut le, ahány eleme van a listának
for i in range(len(szamok)):
# A belső ciklus végigmegy az elemeken, és párosával összehasonlítja őket
for j in range(len(szamok) - 1):
if szamok[j] > szamok[j + 1]: # Ha a bal oldali nagyobb, mint a jobb oldali...
# ...akkor a két elemet megcseréljük!
szamok[j], szamok[j + 1] = szamok[j + 1], szamok[j]
print(f"A rendezett lista: {szamok}")
💻 Feladatok
- Pozitívak kiválogatása: Készíts egy programot, amely egy
homersekletek = [-5, 2, -1, 8, 12, -3, 0]listából a kiválogatás tételével kigyűjti egyplusz_fokoknevű listába a 0-nál nagyobb értékeket, majd kiírja az új listát! - Páros-Páratlan szétválogatás: Hozz létre egy listát véletlenszerű számokkal! A szétválogatás algoritmusa segítségével bontsd két külön listára a számokat aszerint, hogy párosak (oszthatóak 2-vel maradék nélkül, a
%operátor segítségével) vagy páratlanok! Írasd ki mindkét listát! - Közös barátok (Metszet): Hozz létre két listát:
anna_baratai = ["Gábor", "Lilla", "Zsombor", "Kata"]ésbence_baratai = ["Kata", "Zsombor", "Dávid", "Eszter"]. A metszet algoritmusa segítségével keresd meg és írasd ki azokat az embereket, akik Annának és Bencének is közös barátai!