Kirjoittaja: Antti Laaksonen (2009).
⚠ Huomio! Tämä opas on vanhentunut. Oppaan sisältöön ei voi enää luottaa. Opas on säilytetty vain sen historiallisen arvon vuoksi. ⚠
Listojen avulla ohjelma voi käsitellä kätevästi suurta määrää tietoa. Esimerkiksi jos ohjelman muistissa ovat sadan käyttäjän nimet, niiden tallentaminen erillisiin muuttujiin nimi1
, nimi2
, nimi3
, ..., nimi100
olisi hankalaa. Kun nimet ovat listassa, kaikkiin nimiin voi viitata helposti yhden muuttujan nimet
kautta.
Listojen merkittävä etu on, että ohjelman rakenne pysyy samana, vaikka tiedon määrä olisi vaihteleva. Esimerkiksi nimien käsittelyssä samanlainen ohjelma kelpaa tilanteissa, joissa nimiä on viisi, sata ja miljoona. Lisäksi vaikka tiedon määrä olisi pieni, listat voivat selventää ohjelman rakennetta.
Lista on yleisin Python-kielen valmiista tietorakenteista ja soveltuu moniin ohjelmointitehtäviin. Lisää esimerkkejä listan sovelluksista tulee vastaan opassarjan myöhemmissä osissa.
Lista on muuttuja, joka sisältää kokoelman alkioita tietyssä järjestyksessä. Listassa olevat alkiot voivat olla esimerkiksi lukuja tai merkkijonoja.
Seuraavassa ohjelmassa on lista nimet
, joka sisältää nimet Henrikki, Uolevi ja Antti. Ohjelma tulostaa ensin nimet yksi kerrallaan ja sitten uudestaan koko listan. Tämän jälkeen ohjelma muuttaa Uolevin nimeksi Einari ja tulostaa vielä koko listan.
# -*- coding: latin-1 -*- nimet = ["Henrikki", "Uolevi", "Antti"] print "Ensin tulee", nimet[0] print "Sitten on", nimet[1] print "Viimeisenä on", nimet[2] print "Tässä vielä koko joukko:" print nimet nimet[1] = "Einari" print "Toinen onkin", nimet[1] print "Tässä vielä koko joukko:" print nimet
Ohjelman tulostus on seuraava:
Ensin tulee Henrikki Sitten on Uolevi Viimeisenä on Antti Tässä vielä koko joukko: ['Henrikki', 'Uolevi', 'Antti'] Toinen onkin Einari Tässä vielä koko joukko: ['Henrikki', 'Einari', 'Antti']
Listan luonnissa alkiot merkitään hakasulkujen sisään pilkuilla erotettuina. Tämän jälkeen alkioihin voi viitata kokonaisluvuin nollasta alkaen: tässä nimet[0]
on ensimmäinen nimi, nimet[1]
on toinen nimi ja nimet[2]
on kolmas nimi. Listan koko sisällön voi tulostaa antamalla pelkän listan nimen print
-komennolle.
Yksi listan käyttötarkoitus on, että se toimii ohjelman tietovarastona. Seuraavassa ohjelmassa lista sisältää kuukausien nimet suomeksi, jolloin ohjelman on helppoa nimetä käyttäjän antama kuukausi.
# -*- coding: latin-1 -*- lista = ["tammikuu", "helmikuu", "maaliskuu", "huhtikuu", "toukokuu", "kesäkuu", "heinäkuu", "elokuu", "syyskuu", "lokakuu", "marraskuu", "joulukuu"] kuukausi = int(raw_input("Anna kuukausi (1-12): ")) if kuukausi < 1 or kuukausi > 12: print "Kuukausi ei kelpaa!" else: print "Kuukauden nimi:", lista[kuukausi - 1]
Ohjelman tulostus voi olla seuraava:
Anna kuukausi (1-12): 9 Kuukauden nimi: syyskuu
Ohjelman toiminta perustuu siihen, että listan alkioon voi viitata muuttujan avulla. Listassa kuukausien numerointi alkaa nollasta, minkä vuoksi ohjelma pienentää yhdellä käyttäjän antamaa numeroa. Esimerkiksi jos käyttäjä antaa numeron 9, ohjelma hakee kuukauden nimen kohdasta lista[8]
.
Totuusarvo alkio in lista
on tosi, jos alkio on listassa. Vastaavasti totuusarvo alkio not in lista
on tosi, jos alkio ei ole listassa. Seuraava ohjelma tulostaa eri viestin listassa oleville käyttäjille.
# -*- coding: latin-1 -*- sakki = ["Henrikki", "Uolevi", "Antti"] nimi = raw_input("Anna nimi: ") if nimi in sakki: print "Mitä uutta, kuoma?" else: print "Et kuulu sisäpiiriin!"
Tässä on ohjelman mahdollisia tulostuksia:
Anna nimi: Antti Mitä uutta, kuoma?
Anna nimi: Sakke Et kuulu sisäpiiriin!
Jos nimi on Henrikki, Uolevi tai Antti, ohjelma tulostaa viestin "Mitä uutta, kuoma?". Muuten ohjelma tulostaa viestin "Et kuulu sisäpiiriin!".
Listaan voi lisätä alkioita metodilla append
. Seuraavassa esimerkissä lista on aluksi tyhjä ja ohjelma lisää siihen käyttäjän antamia sanoja. Ohjelma päättyy, kun käyttäjä antaa saman sanan uudestaan.
# -*- coding: latin-1 -*- lista = [] while True: sana = raw_input("Kirjoita sana: ") if sana not in lista: lista.append(sana) else: print "Kirjoitit saman sanan uudestaan!" break
Ohjelman tulostus voi olla seuraava:
Kirjoita sana: talo Kirjoita sana: metsä Kirjoita sana: auto Kirjoita sana: tie Kirjoita sana: metsä Kirjoitit saman sanan uudestaan!
Listassa olevat alkiot voi käydä läpi for
-silmukalla. Silmukalle annetaan muuttuja ja lista, jonka jälkeen muuttujan arvo on silmukan joka kierroksella vuorollaan yksi listan alkioista.
Seuraava ohjelma tulostaa kaikkien viikonpäivien nimet:
# -*- coding: latin-1 -*- nimet = ["maanantai", "tiistai", "keskiviikko", "torstai", "perjantai", "lauantai", "sunnuntai"] for nimi in nimet: print nimi
Ohjelman tulostus on seuraava:
maanantai tiistai keskiviikko torstai perjantai lauantai sunnuntai
Seuraava ohjelma kysyy käyttäjältä sanoja, kunnes käyttäjä antaa tyhjän sanan. Sitten ohjelma tulostaa sanojen määrän ja kaikki sanat.
# -*- coding: latin-1 -*- lista = [] while True: sana = raw_input("Kirjoita sana: ") if sana == "": break lista.append(sana) print "Kirjoitit", len(lista), "sanaa." print "Sanat ovat:" for sana in lista: print sana,
Ohjelman tulostus voi olla seuraava:
Kirjoita sana: apina Kirjoita sana: banaani Kirjoita sana: cembalo Kirjoita sana: Kirjoitit 3 sanaa. Sanat ovat: apina banaani cembalo
Tässä funktio len
kertoo, kuinka monta alkiota listassa on.
Edellisen oppaan for
-silmukka kävi läpi luvut 0–9:
# -*- coding: latin-1 -*- for i in range(10): print "Luvun", i, "neliö on", i * i
Tässä range(10)
muodostaa listan [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
.
Listaan liittyvät mm. seuraavat metodit:
metodi | selitys |
---|---|
lista.append(alkio) | lisää alkion listaan (tämä on jo tuttu) |
lista.index(alkio) | etsii alkion kohdan listassa |
lista.count(alkio) | laskee alkion esiintymiskerrat listassa |
lista.remove(alkio) | poistaa alkion listasta |
lista.sort() | järjestää listan alkiot |
lista.reverse() | kääntää listan toisinpäin |
Seuraava ohjelma etsii listasta käyttäjän antaman kuukauden:
# -*- coding: latin-1 -*- lista = ["tammikuu", "helmikuu", "maaliskuu", "huhtikuu", "toukokuu", "kesäkuu", "heinäkuu", "elokuu", "syyskuu", "lokakuu", "marraskuu", "joulukuu"] nimi = raw_input("Anna kuukauden nimi: ") if lista.count(nimi) == 0: print "Kuukausi ei kelpaa!" else: print "Kuukauden numero:", lista.index(nimi) + 1
Ohjelman tulostus voi olla seuraava:
Anna kuukauden nimi: syyskuu Kuukauden numero: 9
Tällä kertaa kuukauden kohtaan listassa pitää lisätä yksi, jotta tuloksena on tuttu kuukauden numero. Esimerkiksi jos kuukausi on syyskuu, se on listassa kohdassa lista[8]
ja ohjelma ilmoittaa numeroksi 9.
Seuraava ohjelma tarkistaa, kuinka monta presidenttiä käyttäjä muistaa:
# -*- coding: latin-1 -*- lista = ["Ståhlberg", "Relander", "Svinhufvud", "Kallio", "Ryti", "Mannerheim", "Paasikivi", "Kekkonen", "Koivisto", "Ahtisaari", "Halonen"] print "Kuinka monta presidenttiä muistat?" maara = 0 while maara < 11: nimi = raw_input("Nimi: ") if nimi == "": break if nimi in lista: print "Oikein!" maara += 1 lista.remove(nimi) else: print "Ei kelpaa!" print "Muistit", maara, "presidenttiä!"
Ohjelman tulostus voi olla seuraava:
Kuinka monta presidenttiä muistat? Nimi: Kekkonen Oikein! Nimi: Virtanen Ei kelpaa! Nimi: Halonen Oikein! Nimi: Kekkonen Ei kelpaa! Nimi: Mannerheim Oikein! Nimi: Muistit 3 presidenttiä!
Ohjelman alussa lista sisältää kaikkien presidenttien nimet. Aina kun käyttäjä muistaa presidentin, ohjelma poistaa sen listasta. Tämän ansiosta käyttäjä ei voi kerätä pisteitä antamalla saman nimen monta kertaa. Ohjelma päättyy, jos käyttäjä antaa tyhjän nimen tai muistaa kaikki nimet.
Seuraava ohjelma lisää käyttäjän antamia lukuja listaan, kunnes käyttäjä antaa luvun nolla. Sitten ohjelma ilmoittaa listan pienimmän ja suurimman luvun, listan lukujen summan sekä järjestyksessä kaikki eri luvut esiintymiskertoineen.
# -*- coding: latin-1 -*- lista = [] while True: luku = int(raw_input("Kirjoita luku: ")) if luku == 0: break lista.append(luku) print "Pienin luku:", min(lista) print "Suurin luku:", max(lista) print "Lukujen summa:", sum(lista) lista.sort() vanha = 0 # listassa ei ole lukua 0 for luku in lista: if luku != vanha: print "Luku", luku, "on listassa", print lista.count(luku), "kertaa." vanha = luku
Ohjelman tulostus voi olla seuraava:
Kirjoita luku: 5 Kirjoita luku: 3 Kirjoita luku: 5 Kirjoita luku: 8 Kirjoita luku: 2 Kirjoita luku: 2 Kirjoita luku: 5 Kirjoita luku: 0 Pienin luku: 2 Suurin luku: 8 Lukujen summa: 30 Luku 2 on listassa 2 kertaa. Luku 3 on listassa 1 kertaa. Luku 5 on listassa 3 kertaa. Luku 8 on listassa 1 kertaa.
Funktiot min
, max
ja sum
kertovat listan pienimmän luvun, suurimman luvun ja lukujen summan. Ohjelma käy lopuksi läpi kaikki luvut mutta tulostaa jokaisen eri luvun vain kerran. Tämän vuoksi ohjelma pitää muistissa muuttujassa vanha
edellisen kierroksen lukua.
Jaa aika hyvä
Nimi: Kekkonen Ei kelpaa!
Kyllä minun mielestäni Kekkonen oli Suomen presidentti... Näin sanoo lähdekoodi ja minun pääni. :)
Hengilö: Kekkonen hyväksyttiin jo kerran. Oppaassa lukee myös näin: "Aina kun käyttäjä muistaa presidentin, ohjelma poistaa sen listasta. Tämän ansiosta käyttäjä ei voi kerätä pisteitä antamalla saman nimen monta kertaa."
Kiitos, näistä oppaista on paljon apua!
Huomio! Kommentoi tässä ainoastaan tämän oppaan hyviä ja huonoja puolia. Älä kirjoita muita kysymyksiä tähän. Jos koodisi ei toimi tai tarvitset muuten vain apua ohjelmoinnissa, lähetä viesti keskusteluun.