Kihagyás

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}")
(Megjegyzés: A 9. fejezetben tanult Halmazok (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

  1. 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 egy plusz_fokok nevű listába a 0-nál nagyobb értékeket, majd kiírja az új listát!
  2. 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!
  3. Közös barátok (Metszet): Hozz létre két listát: anna_baratai = ["Gábor", "Lilla", "Zsombor", "Kata"] és bence_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!