Tartalom: Ciklusok II., listák, join és split (string listává illetve fordítva), lista- és stringműveletek
Eddig négy típussal találkoztunk: a szövegeket stringek (str), az egész számokat int-ek, a törtszámokat float-ok jelölték, és külön típust képeztek még az állítások, amiknek az értéke csak igaz (True) és hamis (False) lehet.
Listákat akkor fogunk használni, ha össze szeretnénk gyűjteni több különböző objektumot. A lista arról ismerszik meg, hogy szögletes zárójelek ([]) közötti, vesszővel elválasztott objektumokból áll. Az objektumok bármilyen típusúak lehetnek és keveredhetnek is.
Itt egy lista:
[3, "pingvin", 2.76, "zsiráf"]
[3, 'pingvin', 2.76, 'zsiráf']
Ez pedig egy üres lista, ez is teljesen szabályos objektum:
[]
[]
Ezekben a listákban pedig mind csak stringek szerepelnek:
torpok = ['Tudor', 'Vidor', 'Szende', 'Szundi', 'Hapci', 'Kuka', 'Morgó']
weasleyk = ['Bill', 'Charlie', 'Percy', 'Fred', 'George', 'Ron', 'Ginny']
zsirafok = ["Abigél", "Benő", "Zsebi"]
Változókat is betehetünk egy listába:
vezeteknev = "Hosszú"
keresztnev = "Katinka"
teljes_nev = [vezeteknev, keresztnev]
print(teljes_nev)
['Hosszú', 'Katinka']
Először nézzünk pár olyan műveletet, amit már ismerünk. Vajon ezek mit csinálnak a listákkal?
A len függvény viselkedése nem túl meglepő, a lista hossza azt mondja meg, hogy hány eleme van a listának
len(torpok)
7
Az összeadás is azt csinálja, amit várunk tőle: összefűz két listát.
torpok + weasleyk
['Tudor', 'Vidor', 'Szende', 'Szundi', 'Hapci', 'Kuka', 'Morgó', 'Bill', 'Charlie', 'Percy', 'Fred', 'George', 'Ron', 'Ginny']
Egy listának hivatkozhatunk egyes elemeire, a sorszámuk alapján. A számozás nullától indul, tehát a lista első elemét Pythonban a lista nulladik elemének fogjuk hívni. Ezt leírni pedig így kell:
torpok[0]
'Tudor'
A számozás tehát el van eggyel "tolódva", az utolsó törp pl. a 6-os sorszámú:
torpok[6]
'Morgó'
Ha nem létező sorszámra hivatkozunk, hibát kapunk:
>>> torpok[7]
IndexError: list index out of range
Hátulról kezdve is számolhatjuk az elemeket, ilyenkor negatív számokat kell használni. Tehát a lista utolsó eleme a -1-es, a hátulról második elem a -2, és így tovább:
torpok[-1]
'Morgó'
Nyilván itt is túl tudunk indexelni és hibát kapunk:
>>> torpok[-8]
IndexError: list index out of range
torpok[-2]
'Kuka'
A sorszámok (más néven: indexek) segítségével hivatkozhatunk a lista egyes szakaszaira is. Pl. az első 4 törpöt így kérdeznénk le, ahogy más megismertük a itt is működnek a "szeletelő jelölések" (célszerűbb az angol terminológia: slice notation
)
torpok[:4]
['Tudor', 'Vidor', 'Szende', 'Szundi']
A másodikat és a harmadikat így:
torpok[1:3]
['Vidor', 'Szende']
Tehát a kettőspont bal oldalán áll az első olyan sorszám, amire kiváncsiak vagyunk, a jobb oldalán pedig az első olyan sorszám, amire már nem. (más néven: balról zárt, jobbról nyílt intervallum). Ezt időbe telhet megszokni, de vannak előnyei is, pl. a két sorszám különbsége megadja, milyen hosszú lesz az új lista.
Sorszámként használhatjuk a negatív számokat is, tehát egyszerűen mondhatunk olyat, hogy pl. a második elemtől az utolsó előttiig:
torpok[1:-1]
['Vidor', 'Szende', 'Szundi', 'Hapci', 'Kuka']
Ez az eljárás a slicing, vagyis szeletelés, és tulajdonképpen egy művelet, ami listából listát csinál. Pont ugyanígy működik stringekre is, ott a betűket "szeleteljük":
Persze ilyen kifejezésekből is kombinálhatunk többet. Pl. megkérdezhetjük, mi az utolsó előtti törpe nevének első három betűje:
torpok[-2][:3]
'Kuk'
Ahogy azt a stringeknél megszokhattuk, amikor listát vagy stringet "szeletelünk", azt is megtehetjük, hogy két pozíció között nem mindegyik elemet vesszük ki a listából/stringből, hanem pl. minden másodikat, minden harmadikat, stb. Ilyenkor egy második kettőspontot is írunk, és ezután adjuk meg, hogy mekkora "ugrásokat szeretnénk". Az alábbi példa azt jelenti, hogy a lista harmadik elemétől induljunk, minden második elemet vegyünk ki, és ne menjünk tovább, mint a hetedik:
lista = [1,2,3,4,5,6,7,8,9,10]
lista[2:7:2]
[3, 5, 7]
Ha az első vagy második indexet üresen hagyjuk, az a lista elejét ill. végét jelenti. Az alábbi tehát azt jelenti, hogy az egész listából kérünk minden harmadik elemet:
lista[::3]
[1, 4, 7, 10]
lista[-1::-1]
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
lista[-1:2:-1]
[10, 9, 8, 7, 6, 5, 4]
Most nézzünk néhány egyszerű műveletet, amivel a listát manipulálhatjuk. Például megváltoztathajuk egy-egy elemét:
lista = [1,2,3]
lista[0] = 7
lista
[7, 2, 3]
Vagy egy listának egy egész szelete felülírható egy másik listával:
lista = [1,2,3,4,5]
lista[1:3] = [102, 103]
lista
[1, 102, 103, 4, 5]
Az append paranccsal új elemeket fűzhetünk egy lista végére:
lista.append(9)
lista
[1, 102, 103, 4, 5, 9]
Törölhetünk elemeket a remove paranccsal:
Megjegyzés: listák esetén a remove csak az első előfordulást törli.
lista.remove(102)
lista
[1, 103, 4, 5, 9]
A listát sorbarendezhetjük a sort paranccsal:
lista.sort()
lista
[1, 4, 5, 9, 103]
Ha a listában stringek vannak, a sort ábécébe rendezi őket:
torpok.sort()
torpok
['Hapci', 'Kuka', 'Morgó', 'Szende', 'Szundi', 'Tudor', 'Vidor']
Olyan listát, amiben string és szám is van, nem tudunk rendezni, hibát kapunk.
lista = [3, "pingvin", 2, "jegesmedve"]
lista.sort()
lista
TypeError: '<' not supported between instances of 'str' and 'int'
De számokból lehet kétféle (int és float):
lista = [4, 2.3, 1, 3.2]
lista.sort()
lista
[1, 2.3, 3.2, 4]
A listákat megfordíthatjuk a reverse paranccsal:
lista.reverse()
lista
[4, 3.2, 2.3, 1]
Megkérdezhetjük egy elemről, hogy a lista hányadik helyén található, erre való az index parancs: Megjegyzés: listák esetén az index az első előfordulást adja vissza.
weasleyk.index("Ron")
5
Megszámolhatjuk, hogy egy elem hányszor szerepel egy listában, a count paranccsal:
lista.count(2)
0
Mindezen műveletek stringekre is működnek, az alábbi kód pl. megmondja, hogy a legidősebb Weasley testvér nevében hány l betű van:
weasleyk[0].count('l')
2
Egy listát le is másolhatunk, ha módosítani akarjuk, de nem akarjuk az eredetit elveszíteni:
weasleyk2 = weasleyk.copy()
weasleyk2.sort()
weasleyk2
['Bill', 'Charlie', 'Fred', 'George', 'Ginny', 'Percy', 'Ron']
Az in szóval ellenőrizhetjük, hogy egy elem benne van-e egy listában/stringben:
"Ron" in weasleyk
True
"Kuka" in weasleyk
False
"k" in "Kuka"
True
"c" in "Kuka"
False
Ezek állítások, tehát egy if vagy elif után is állhatnak. Az alábbi program például ellenőrzi, hogy van-e egy szóban i betű:
#print("Írd be a szót!")
#szo = input()
szo = "Csabi"
if "i" in szo:
print("Ebben van i")
else:
print("Ebben nincs i")
Ebben van i
A split parancsról már volt szó, szétvág egy stringet a szóközök mentén (paraméterek nélkül hívva legalábbis), és a kapott szavakat egy listában adja vissza:
mondat = "A kockázatok és mellékhatások tekintetében olvassa el a betegtájékoztatót vagy kérdezze meg kezelőorvosát, gyógyszerészét"
szavak = mondat.split()
szavak
['A', 'kockázatok', 'és', 'mellékhatások', 'tekintetében', 'olvassa', 'el', 'a', 'betegtájékoztatót', 'vagy', 'kérdezze', 'meg', 'kezelőorvosát,', 'gyógyszerészét']
A join parancs stringet ad vissza, egy megadott string szeparátorral fűzi össze a lista elemeit.
"--".join(szavak)
'A--kockázatok--és--mellékhatások--tekintetében--olvassa--el--a--betegtájékoztatót--vagy--kérdezze--meg--kezelőorvosát,--gyógyszerészét'
print("Itt az elem egy konkrét listaelem nem pedig integer:")
for elem in szavak:
print(elem, end = " ")
print("\n\nWhile ciklus és i (int) változó:")
i = 0
while i < len(szavak):
print(szavak[i], end = " ")
i += 1
print("\n\nFor ciklus és i (int) változó:")
i = 0
for _ in szavak:
print(szavak[i], end = " ")
i += 1
Itt az elem egy konkrét listaelem nem pedig integer: A kockázatok és mellékhatások tekintetében olvassa el a betegtájékoztatót vagy kérdezze meg kezelőorvosát, gyógyszerészét While ciklus és i (int) változó: A kockázatok és mellékhatások tekintetében olvassa el a betegtájékoztatót vagy kérdezze meg kezelőorvosát, gyógyszerészét For ciklus és i (int) változó: A kockázatok és mellékhatások tekintetében olvassa el a betegtájékoztatót vagy kérdezze meg kezelőorvosát, gyógyszerészét
A listaértelmezések (list comprehension) a listák létrehozásának rövidebb módja.
print([elem for elem in szavak])
['A', 'kockázatok', 'és', 'mellékhatások', 'tekintetében', 'olvassa', 'el', 'a', 'betegtájékoztatót', 'vagy', 'kérdezze', 'meg', 'kezelőorvosát,', 'gyógyszerészét']