Kirjautuminen

Haku

Tehtävät

Opasarkisto: Python 2 -ohjelmointi: Osa 5 - Listojen käsittely

  1. Osa 1 - Ensimmäinen ohjelma
  2. Osa 2 - Tiedon käsittely
  3. Osa 3 - Ehtorakenteet
  4. Osa 4 - Toistorakenteet
  5. Osa 5 - Listojen käsittely
  6. Osa 6 - Merkkijonot
  7. Osa 7 - Omat funktiot
  8. Osa 8 - Tiedostot ja virheet
  9. Osa 9 - Standardikirjasto
  10. Osa 10 - Tietorakenteet
  11. Osa 11 - Alkeita edemmäs
  12. Osa 12 - Yhteenveto
  13. Liite 1 - Asennus ja käyttö
  14. Liite 2 - Python ja ääkköset

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

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.

Esimerkki: Kuukaudet

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].

Listassa oleminen

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!".

Alkion lisääminen

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!

Listan läpikäynti

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].

Listan metodit

Listaan liittyvät mm. seuraavat metodit:

metodiselitys
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.

Esimerkki: Presidentit

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.

Esimerkki: Lukutilasto

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.


Kommentit

ErroR++ [27.04.2011 14:13:40]

#

Jaa aika hyvä

Hengilö [05.05.2013 14:40:20]

#

Nimi: Kekkonen
Ei kelpaa!

Kyllä minun mielestäni Kekkonen oli Suomen presidentti... Näin sanoo lähdekoodi ja minun pääni. :)

Metabolix [05.05.2013 15:02:35]

#

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."

K00DAR1 [09.10.2017 17:44:57]

#

Kiitos, näistä oppaista on paljon apua!

Kirjoita kommentti

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.

Muista lukea kirjoitusohjeet.
Tietoa sivustosta