Kihagyás

Szerkesztés alatt!

Az oldal további része szerkesztés alatt áll, a tartalma minden további értesítés nélkül többször, gyakran, jelentősen megváltozhat!

Számlálás, bejárás index segítségével

Tartalom

Az enumerate() függvény és használata. A for i in range(...) konstrukció. Feladatmegoldások számlálás és indexbejárás segítségével.

Gyakorló feladatok - ZH-hoz

1. gyakorló feladat

Hozz létre egy függvényt azonosito() néven, ami egy szöveget vár! A függvény egységesíti a kapott szöveget és 5 hosszúra alakítja a következők szerint:

  1. A szöveget mindenképpen nagybetűsítjük.
  2. Amennyiben a szöveg hossza nagyobb, mint 5, a szöveg végét vágjuk le, hogy csak 5 hosszú legyen!
  3. Amennyiben a szöveg hossza kisebb, mint 5, a szöveg végére tegyünk megfelelő számú X karaktert, hogy 5 legyen a hossza.

A függvény adja vissza az 5 karakteres eredményszöveget!

2. gyakorló feladat

A korábban megírt azonosito() függvényt is fel fogjuk használni, játékosok ranglistáját készítjük el. Ennek során ne a függvény tartalmát másold ki, hanem ténylegesen ezt hívd meg! Legyen egy ranglista() függvény, amely egy listát vár paraméterben, a lista tetszőleges számú játékos nevét tartalmazza, a helyezésük sorrendjében. A függvény egy új listában készítse el és adja vissza a teljes ranglistát a következő minta szerint, sorszámozva (1-től kezdve), és a neveket az azonosito() függvénnyel átalakítva (ha ["Alex","Julia","István","Ond"] a bemenet):

1
2
3
4
1. ALEXX
2. JULIA
3. ISTVÁ
4. ONDXX
3. gyakorló feladat

Készítsünk egy dontetlen() függvényt, amely egy listát vár paraméterben. A lista minden eleme egy szöveg, amelynek első két karaktere az adott játékos által elért pontszám két számjegyen (tehát a 7 pont 07-ként kerül be), az összes ezutáni karakter pedig az adott játékos neve. A játékosok pontszám szerint csökkenő sorrendben vannak a listában. Nézzük végig a listát, és adjuk vissza az első olyan párt, akik ugyanolyan ponttal rendelkeznek! Ez legyen "Név1-Név2" formában! Ha nincs egy döntetlen sem, akkor a függvény False logikai értéket adjon vissza. Azzal nem kell külön foglalkoznunk, ha esetleg 3 vagy több ugyanolyan pontszámú lenne, ilyenkor is az első kettőt kell visszaadnunk csak.

A range függvény

A range() függvény egy számsorozatot ad vissza a megadott paraméterei szerint. Az első paraméter a felső határt adja meg, ilyen esetben a számlálás 0-tól indul, és a megadott határtól eggyel kisebb értéket vesz fel utoljára.

range(stop) példa
1
2
for szam in range(6):
    print(szam)

A fenti példa kimenete:

1
2
3
4
5
6
0
1
2
3
4
5

Ha két paramétert is írunk, akkor a range() első paramétere a kezdőérték (ezt is felveszi), míg a második a végérték (amit már nem vesz fel).

range(start,stop) példa
1
2
for szam in range(2,6):
    print(szam)

A fenti példa kimenete:

1
2
3
4
2
3
4
5

Ha három paramétert is írunk, akkor a kétparaméteres változattal megegyezően a range() első paramétere a kezdőérték (ezt is felveszi), míg a második a végérték (amit már nem vesz fel), a harmadik pedig a lépésköz lesz, ennyit fog "ugrani", ez alapértelmezetten 1 lenne.

range(start,stop,step) példa
1
2
for szam in range(2,6,2):
    print(szam)

A fenti példa kimenete:

1
2
2
4

A kezdő- és végértéknek természetesen gond nélkül megadhatunk negatív számot is. Ha a kezdőérték nagyobb, mint a végérték, és nem adunk meg lépésközt, akkor az eredmény üres lesz. Azonban negatív lépésköz is megadható, így visszafelé lépkedést is megoldhatunk.

range() negatív lépésközzel
1
2
for szam in range(6,2,-1):
    print(szam)

A fenti példa kimenete:

1
2
3
4
6
5
4
3
range(), ha nem akarunk kezdőértéket

A paraméterek számából dől el, hogy melyik változata fut a range() függvénynek. Ez azt jelenti, hogy ha nem szeretnénk kezdőértéket megadni, de lépésközt igen, akkor oda kell írnunk a 0-t mint kezdőérték. Tehát például ha 0-9-et 2-es lépésközzel járnánk be, akkor range(0,10,2) lenne a helyes megadás, mivel a range(10,2) önmagában a 10-et tekintené kezdőértéknek, és a 2-t végértéknek (ami üres eredmény lenne).

A range() függvény eredménye nem list típusú

Habár Python 2-ben még listát adott vissza, a range() függvény kimenete Python 3-ban "immutable sequence type" típusú, ami "generátor"-ként működik. Vagyis nem tárolja el előre az intervallum elemeit, hanem igény szerint generálja és adja vissza, mindig a "következő" elemet.

Az intervallum bejárható (for segítségével), de például szöveggé alakítva nem az elemeit látjuk. Ettől függetlenül az esetek túlnyomó többségében gondolhatunk rá listaként, de ha ténylegesen listaként akarjuk használni, akkor előtte a korábban már látott list() függvényt használva listává kell alakítani.

range() kimenet típusa
1
2
print(range(0,10))
print(list(range(0,10)))

A fenti példa kimenete:

1
2
range(0, 10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Listák indexei

A korábbiakban már láttuk, hogy a listák elemeit bármikor elérhetjük, és meg is változtathatjuk az indexen keresztül. Az index így egy kifejezetten jó út bejárásra is.

Lista bejárása for in range szerkezettel

A for ebben az esetben nem konkrétan a listaelemeket, hanem az indexet járja be, ahogy az előző példákban is látható volt. A range egy számsorozat a listaelemeket mindig a lista elejétől a végéig, sorrendben járja be.

Lista elemeinek egyszerű bejárása for-in - range segítségével

1
2
3
4
napok = ["hetfo", "kedd", "szerda", "csutortok", "pentek", "szombat", "vasarnap"]

for i in range(len(napok)):
    print(napok[i])
A fenti példa kimenete:
1
2
3
4
5
6
7
hetfo
kedd
szerda
csutortok
pentek
szombat
vasarnap

Az iterátor számot tartalmaz

Fontos tudni, hogy itt az iterátor (a kódban i) nem az elemeket veszi fel, ez egy szám, amit címzésre használunk a listában navigáláskor. Tehát a napok[i] kifejezésre gondolhatunk úgy, mintha felkeresnénk az i címen lévő elemet a napok listából.

A range()-ben nem lehet listát átadni

Hajlamosak lehetünk kifelejteni a len()-t a range(len(napok)) részből. Ez azért fontos, mert a range nem tud listát bejárni, ez csak számot vár, a len fogja meghatározni a kollekció hosszát, ami biztosan szám, ezért így tud működni.

Mikor használjuk ezt a for in lista szerkezet helyett?

Nagyon sok esetben ez preferencia kérdése, egyes dolgokat könnyebb így vagy úgy megvalósítani. Számos esetben jól jöhet, ha a konkrét érték mellett a helyét is meg tudjuk mondani. Gondolhatunk példaként olyan esetre, hogy a listaelemek maximumát keressük. Ilyenkor mindkét módszer jó. De ha meg kell mondanunk, hogy ez a maximum konkrétan hányadik listaelem emellett még, akkor kapóra jön, hogy ezzel a sorszámmal eleve rendelkezünk, nem kell keresnünk, vagy kiszámolnunk.

Az enumerate függvény

Az enumerate() függvény egy iterálható (iterable) objektumot ad vissza egy paraméterben megkapott kollekcióból (például listából), ez azt jelenti, hogy egy for-ral ezután végig tudunk menni rajta. Ez tuple szerkezeteket tartalmaz, amelyről később részletesebben tanulunk majd, a használatuk ezen a szinten megegyezik a listákkal (pl. indexeléssel elérhető elemek).

Ezek a tuple-ök valójában párok, aminek az első eleme az index, a második pedig az érték: (index, érték). Az index mindig 0-tól kezdődően növekszik, az érték pedig bármi lehet, amit a kollekció tárolt (például sztring-listáknál sztring).

Az enumerate segíthet abban, hogy a bejárásnál egyszerre rendelkezzünk az indexszel és az értékkel is.

Lista elemeinek bejárása enumerate() segítségével

1
2
for par in enumerate(["hétfő","kedd","szerda","csütörtök","péntek","szombat","vasárnap"]):
    print(str(par) + ": " + str(par[1]) + " a hét " + str(par[0]+1) + ". napja.")
A fenti példa kimenete:
1
2
3
4
5
6
7
(0, 'hétfő'): hétfő a hét 1. napja.
(1, 'kedd'): kedd a hét 2. napja.
(2, 'szerda'): szerda a hét 3. napja.
(3, 'csütörtök'): csütörtök a hét 4. napja.
(4, 'péntek'): péntek a hét 5. napja.
(5, 'szombat'): szombat a hét 6. napja.
(6, 'vasárnap'): vasárnap a hét 7. napja.

A többszörös értékadás segítségével ezt a két elemet rögtön változókba is menthetjük, amely egyes esetekben szebb kód lehet.

Lista elemeinek bejárása enumerate() segítségével - többszörös értékadással

1
2
for index, nev in enumerate(["hétfő","kedd","szerda","csütörtök","péntek","szombat","vasárnap"]):
    print(str(nev) + " a hét " + str(index+1) + ". napja.")
A fenti példa kimenete:
1
2
3
4
5
6
7
hétfő a hét 1. napja.
kedd a hét 2. napja.
szerda a hét 3. napja.
csütörtök a hét 4. napja.
péntek a hét 5. napja.
szombat a hét 6. napja.
vasárnap a hét 7. napja.

A sum függvény

A sum() függvény egyetlen számot ad vissza, ami egy kollekciót bejárva annak összegét adja meg. A sum várhat egy extra paramétert a kollekció után, ami egy szám lehet, ilyenkor ezt is hozzáadja az összeghez. A sum nem alkalmas két kollekció összegzésére, nem támogat ilyen paraméterezést.

Lista összegzése sum() segítségével

1
2
3
elemek = [1,2,3,4]
print(sum(elemek))
print(sum(elemek,3))
A fenti példa kimenete:
1
2
10
13

A sum() számokra működik

A sum matematikai összeget készít. Ha a kollekció nem szám (azaz nem int vagy float) elemet is tartalmaz, akkor TypeError-t kapunk. Szövegeknél a sum nem végez konkatenációt, azokra jobban járunk, ha a "".join(listam) kódot használjuk.

Feladatok

1. feladat

Hozz létre egy listát vikingek néven, ami vikingek nevét tartalmazza, illetve egy faklya nevű listát, ami azt írja le a másik listával megegyező sorrendben, hogy melyikük hány órát égette eddig a fáklyáját. Értékeik lehetnek például ["Gunnar", "Astrid", "Halvar", "Ingrid"] és [7,5,8,7]. Majd:

  1. Írd ki ezeket az adatokat egyben, soronként ilyen formában: Gunnar fáklyája 7 órát égett eddig.!
  2. Írd ki, hogy összesen eddig hány órát égették a fáklyáikat a vikingek!
  3. Írd ki, hogy mennyi ideig égett a legkevesebbet égett fáklya!
  4. Írd ki, hogy kié az a fáklya, ami a legkevesebbet égett eddig - ha több ilyen is van, írj ki egy listát ezekről!
  5. Kérj be egy számot a felhasználótól a standard inputon, ez azt írja le, hogy egy fáklya hány óráig égethető összesen. Számold ki, és írd ki, hogy ezek alapján a vikingek még hány óráig tudják összesen égetni fáklyáikat (ha eleve túllépték, pl. 7 ez az érték, de Halvar 8-at égetett, az nem jár levonással itt, ő ugyanúgy 0-t tudja ezután égetni)!
2. feladat

Készíts egy listát, amely felváltva szavakat és számokat tartalmaz. Ez a faluban épült épületek megnevezését és árát reprezentálja az építés sorrendjében, például ["barakk",700,"őrtorony",500,"kovácsműhely",600,"fal",2500,"bánya",400,"őrtorony",500]. Majd:

  1. Írd ki, hogy összesen mennyit költöttünk az épületek megépítésével!
  2. Soronként írd ki a megépített épületek nevét a legújabbtól a legrégebbi felé haladva (tehát visszafelé)!
  3. Kérj be egy számot a felhasználótól a standard inputon, ez a kezdeti keretünk, határozd meg és írd ki, hogy melyik épület az utolsó, ami megépítése még belefért a kezdeti keretbe, illetve ez hányadik épület volt! Ha mind belefért, akkor írd ki, hogy mind belefért a keretbe!