Järjendid
Järjend (ingl list) on andmetüüp loetelude esitamiseks. Järjendi loomiseks on kõige lihtsam viis kirjutada järjendisse kuuluvad väärtused (ehk järjendi elemendid) komadega eraldatult nurksulgude vahele.
numbrid = [5, 1, 6, 8, 3.14] nimed = ["Ats", "Lennart", "Keit"] segu = [3, "õun"]
Salvestasime muutujasse andmed. Erinevalt sõnest saab järjendisse salvestada erinevaid tüüpi andmeid. Kui me oleme järjendi kirja pannud, siis tekib loomulikult küsimus, mida sellega teha saab? Mõnesid põhioperatsioone demonstreerib järgnev programm:
loomad = ["karu", "rebane", "koer", "kotkas"] print("Praegune järjend on selline: ") print(loomad) loomade_arv = len(loomad) print("Järjendis on " + str(loomade_arv) + " looma!") loomad = loomad + ["kajakas", "hüljes", "rebane"] print("Uus järjend on selline: ") print(loomad) if "rebane" in loomad: rebasteArv = loomad.count("rebane") print("Rebaseid on loomade järjendis " + str(rebasteArv)) else: print("Rebaseid ei ole loomade järjendis!") koduloom = loomad[2] print("Järjendi kolmas element on koduloom " + koduloom)
Katseta programm ise läbi. Mis ilmub ekraanile?
Ilmselt märkasid kahte operatsiooni (len ja in), mida oled juba kasutanud sõnede puhul. Kuna sõnet saab vaadelda kui sümbolite järjendit, siis ongi Pythonis korraldatud nii, et paljud järjendioperatsioonid toimivad ka sõnedega.
Mõned olulisimad järjendioperatsioonid.
Avaldis | Väärtus | Selgitus |
---|---|---|
min([2, 1, 3]) | 1 | Minimaalne element |
max([2, 1, 3]) | 3 | Maksimaalne element |
sorted([2, 1, 3]) | [1, 2, 3] | Tagastab järjestatud järjendi |
[1, 2] == [2, 1] | False | Elementide järjekord loeb |
sum([2, 1, 3]) | 6 | Elementide summa |
Nagu sõnedel on ka järjenditel indeksid, mis näitavad elemendi positsiooni. Samal põhimõttel saab järjendist elemente.
a = [1,2,3,4] number = a[2]
Mis väljastatakse print(number) korral?
Järjendi video
Enesekontroll
Negatiivsed indeksid
Vahepeal võib tulla ette, et me tahame järjendi lõpus olevaid elemente. Selleks, et ei peaks lugema hakkama, kus nad asuvad, on Pythonis negatiivsed indeksid.
järjend = [1,2,3,4,5,6,7] print(järjend[-1])
Ekraanile ilmub kõige tagumine element ehk 7.
Funktsioon range. Saab kasutada 2 või 3 argumendiga. Järgnevas käsurea näites kasutame jälle funktsiooni list, et näha, mida mingi range variant tähendab.
>>> list(range(5)) [0, 1, 2, 3, 4] >>> list(range(0, 5)) [0, 1, 2, 3, 4] >>> list(range(2, 5)) [2, 3, 4] >>> list(range(0, 15, 2)) [0, 2, 4, 6, 8, 10, 12, 14] >>> list(range(5, 0, -1)) [5, 4, 3, 2, 1] >>> list(range(0, 5, 1)) [0, 1, 2, 3, 4]
Ühe argumendiga variandi puhul algab loetelu 0-st ning lõpeb enne näidatud argumendi väärtuseni jõudmist. Kahe argumendi puhul algab loetelu esimese argumendi väärtusest ja lõpeb enne teise argumendini jõudmist. Kolme argumendi puhul näitab kolmas argument väärtuste kasvamise sammu.
Tihti on tarvis teha mingi sõne pisut suuremateks juppideks kui üksikud tähed – näiteks võib olla vaja jagada sõnena esitatud lause eraldi sõnadeks. Selle jaoks saab kasutada sõnemeetodit split.
>>>"Tere Maailm!".split() ['Tere', 'Maailm!'] >>> "t;ere;31;p;äeva".split(";") ['t', 'ere', '31', 'p', 'äeva']
Kui split-i kasutada ilma argumentideta, siis tehakse lõikamine tühikute, tabulaatorite ja reavahetuste kohalt. Kui anda ette mingi muu sümbol, siis lõigatakse sõne juppideks just selle sümboli kohalt.
Käsu split „vastand“ on meetod join:
>>> ' '.join(['Tere', 'hommikust']) 'Tere hommikust' >>> ';'.join(['CY2X44', '3', '66', 'T']) 'CY2X44;3;66;T'
Enesekontroll
Järjendite viilutamine
Kirjutades nurksulgudesse indeksi asemel indeksivahemiku on järjendist (ja sõnedest) võimalik võtta alamjärjendeid (alamsõnesid):
>>> a = ['a', 'b', 'c', 'd', 'e', 'f'] >>> a[0:2] ['a', 'b'] >>> a[:2] ['a', 'b'] >>> a[2:6] ['c', 'd', 'e', 'f'] >>> a[2:] ['c', 'd', 'e', 'f'] >>> a[-2:] ['e', 'f'] >>> s = "Tere" >>> s[0:3] 'Ter'
Koolonist vasakule tuleb kirjutada see indeks, millest alates tuleb elemente tulemusse kopeerida, ning koolonist paremale see indeks, mille juures tuleb kopeerimine lõpetada (st selle indeksiga element jääb tulemusest välja). Kui vasak indeks jätta kirjutamata, siis alustatakse esimesest elemendist, ja kui parem indeks jätta kirjutamata, siis kopeeritakse kuni järjendi lõpuni (viimane element kaasa arvatud).
Failist järjendisse lugemine
Readline ja readlines
Eelmises peatükis õppisime, kuidas for-tsükliga faili lugeda. Veel kaks funktsiooni on readline ja readlines. readline loeb failist ühe rea. See võib kasulik olla, kui teame, mis failis on, et sealt ainult rida lugeda. Veel on käsk readlines, mis loeb kõik failis olevad read ja salvestab nad järjendina. Kasutame juba varasemalt loodud teksitifaili andmed.txt.
Taavi Mia Karl Sirli 314
fail = open("andmed.txt") andmed = fail.readlines() print(andmed) fail.close()
Ekraanile väljastatakse: ['Taavi\n', 'Mia\n', 'Karl\n', 'Sirli\n', '314']
Nagu näeme, siis järjendis on elemendid sõne kujul, kus viimane element on \n, mis tähistab realõppu. Tuleb meeles hoida, et elemente töödeldes realõpumärk eemaldada.
Tsükliga failist järjendisse lugemine
Üks kasulik oskus on failist järjendisse lugemine. Oletame, et meil on fail andmed.txt nädala temperatuuridega, kus on igal real vastava päeva keskmine temperatuur (ujukoma arv):
10.5 11.2 12.3 9.5 7.8 10.6 10.7
Kui meil on soov need temperatuurid järjendisse temperatuurid
lugeda, siis saame selleks kasutada konstruktsiooni for rida in fail
. Seejuures peame arvestama, et kuna failist lugedes on tegemist sõnedega, siis tuleb meil enne järjendisse lisamist käsuga append
need read teisendada ujukoma (float) tüüpi.
temperatuurid = [] fail = open("andmed.txt") for rida in fail: temperatuurid.append(float(rida)) fail.close() print(temperatuurid)
Eelnev programm väljastab ekraanile:
[10.5, 11.2, 12.3, 9.5, 7.8, 10.6, 10.7]
Tsükliga failist rea järjendisse lugemine
Kui meil on ühel real mitu elementdi, mida tahaks järjendisse lugeda, siis saame rea tükkideks lõikamiseks kasutada funktsiooni split
.
Näiteks, kui meil on failis arvud.txt ühel real päeva miinimum- ja maksimumtemperatuurid:
5.0 15.2 6.2 12.4 7.2 12.3 5.1 10.5 4.8 9.5 4.5 10.8 6.2 12.5
Siis saame lugeda andmed failist programmi sarnaselt eelmisele näitele, aga ühe rea saame tükkideks lüüa ja järjendisse panna käsklusega split(). Kui meil oleks elementide vahel näiteks semikoolon, siis saaksime kasutada käsklust split(";"), aga vaikimis tükeldab see funktsioon sõne tühikute kohalt.
fail = open("arvud.txt") for rida in fail: osad = rida.split() print(round(float(osad[1]) - float(osad[0]),1)) fail.close()
Nuputa! Püüa aru saada, mis selle programmiga ekraanile väljastatakse?
Järjendi ja funktsiooni video
Enesekontroll