Listarakenne

Takaisin pääsivulle

Lista

Lista on eräs hyvin oleellinen tietorakenne muuttujien tallentamiseen. Python kielessä muuttuja määritellään listaksi jos sen arvoksi annetaan hakasulut ([]). Listatietorakenteella on erityisiä, listalle kuuluvia toimintoja, kuten lisääminen komennolla append ja poistaminen komennolla pop. Toisin kuin tavallisilla muuttujilla, listarakenteisiin liittyviä komentoja kutsutaan sanomalla listamuuttujan nimi, piste, komennon nimi. Esimerkiksi komento lista.append(1) kutsuisi listaan liittyvää komentoa append eli lisäisi listan loppuun muuttujan, jonka arvo on 1. Seuraavassa esimerkissä luodaan lista-niminen muuttuja, ja lisätään siihen luvut yhdestä viiteen. Tämän jälkeen listan sisältö tulostetaan.

# -*- coding: utf-8 -*-

def main():
    lista = []
    lista.append(1)
    lista.append(2)
    lista.append(3)
    lista.append(4)
    lista.append(5)

    print lista

main()

Listaan voi myös asettaa arvot suoraan seuraavasti.

# -*- coding: utf-8 -*-

def main():
    lista = [1, 2, 3, 4, 5]

    print lista

main()

Listan läpikäynti for-toistolausekkeella

While-toistolausekkeen lisäksi on olemassa toinen toistokäsky, for. Toistokäskyä for käytetään eritoten listojen läpikäyntiin, sillä se mahdollistaa jokaisen listan alkion läpikäynnin vuorotellen. Käskyn for voi lausua esimerkiksi "jokaiselle", kokonaisuudessaan for-lausetta käytetään esimerkiksi seuraavasti: for alkio in lista:, jossa käytäisiin vuorotellen jokainen lista-muuttujassa oleva alkio läpi. Seuraavassa esimerkissä lisätään ensin alkiot listaan, jonka jälkeen jokainen tulostetaan vuorotellen.

# -*- coding: utf-8 -*-

def main():
    lista = []
    lista.append(1)
    lista.append(2)
    lista.append(3)
    lista.append(4)
    lista.append(5)

    for alkio in lista:
        print alkio

main()

Ohjelman tulostus on seuraava:

1
2
3
4
5

Komento insert

Komento append lisää alkion aina listan loppuun. Komento insert taas saa parametrina sekä indeksin, eli sijainnin listalla, johon uusi alkio laitetaan, että itse alkion. Uuden alkion lisääminen listan alkuun tapahtuu komennolla lista.insert(0, 1), missä 0 kuvaa listan alkua, ja 1 uutta alkiota.

# -*- coding: utf-8 -*-

def main():
    lista = []
    lista.insert(0, 1)
    lista.insert(0, 2)
    lista.insert(0, 3)
    lista.insert(0, 4)
    lista.insert(0, 5)

    print "Listassa on yhteensä " + str(len(lista)) + " alkiota."
    for alkio in lista:
        print alkio

main()
Listassa on yhteensä 5 alkiota.

5
4
3
2
1

Huomaamme että for-komennolla listaa läpikäydessä käymme sen alusta loppuun. Yllä käytetty komento len kertoo listalla olevien alkioiden määrän.

Ohjelmistoissa käytettävissä listoissa olevia alkioita lasketaan nollasta lähtien. Ensimmäinen alkio on siis listoja käytettäessä nollas alkio, ja kun alkio halutaan asettaa listan ensimmäiseksi, asetetaan se listan kohtaan nolla.

Komento pop

Yksittäisten alkioiden poistaminen listalta tapahtuu komennolla pop. Jos pop-komennolle ei anna mitään parametreja, poistaa se listan viimeisen alkion. Jos taas komennolla antaa parametrin, toimii parametri poistettavan indeksinä eli sijaintina listassa.

Luodaan ohjelma, johon aamulla kirjoitetaan päivän tehtävät, ja josta niitä tehdään yksi kerrallaan. Kun käyttäjä syöttää tekstin "valmis", on tehtävien syöttö valmista. Tehtävän voi merkitä valmiiksi antamalla tyhjän syötteen. Komento len tulee taas hyödylliseksi. Komennolla len saadaan tietoon listassa olevien alkoiden lukumäärä. Käytetään sitä while toiston kanssa luomaan ehto "Niin pitkään kun tehtäviä on jäljellä", jonka avulla voimme luoda ohjelman joka näyttää tehtäviä niin pitkään kun niitä on jäljellä.

# -*- coding: utf-8 -*-

def main():
    tehtavat = []

    while True:
        tehtava = raw_input("Anna tehtävä tai kirjoita 'valmis' kun valmista: ")
    
        if tehtava == "valmis":
            break
        
        tehtavat.insert(0, tehtava)
    

    print ""
    print "Tälle päivälle on yhteensä " + str(len(tehtavat)) + " tehtävää, aletaan tekemään."

    while len(tehtavat) > 0:
        tehtava = tehtavat.pop()
        print "Seuraava tehtäväsi on: " + tehtava
    
        while True:
            syote = raw_input("Kirjoita 'valmis' kun olet tehnyt tehtävän: ")
        
            if syote == "valmis":
                print "Hyvä!"
                break


    print "Hienoa, olet tehnyt kaikki päivän tehtäväsi!"

main()
Anna tehtävä tai kirjoita 'valmis' kun valmista: Vie roskat
Anna tehtävä tai kirjoita 'valmis' kun valmista: Käy kaupassa
Anna tehtävä tai kirjoita 'valmis' kun valmista: Tyhjennä tiskikone
Anna tehtävä tai kirjoita 'valmis' kun valmista: valmis

Tälle päivälle on yhteensä 3 tehtävää, aletaan tekemään.
Seuraava tehtäväsi on: Vie roskat
Kirjoita 'valmis' kun olet tehnyt tehtävän: valmis
Hyvä!
Seuraava tehtäväsi on: Käy kaupassa
Kirjoita 'valmis' kun olet tehnyt tehtävän: valmis
Hyvä!
Seuraava tehtäväsi on: Tyhjennä tiskikone
Kirjoita 'valmis' kun olet tehnyt tehtävän: valmis
Hyvä!
Hienoa, olet tehnyt kaikki päivän tehtäväsi!

Listat listojen sisällä

Listat voivat sisältää myös listoja. Esimerkiksi pygamen monikulmioiden piirtämisessä käytettävä funktio pygame.draw.polygon saa parametrinaan listan pisteitä, jotka ilmaistaan x- ja y-koordinaatteina.

pygame.draw.polygon(naytto, (red, green, blue), [(ekax, ekay), (tokax, tokay), ..., (vikax, vikay)], viivan_leveys)

Jos ylläolevalle kutsulle asettaa viivan leveyden nollaksi, monikulmio värjätään kokonaan annetulla värillä. Seuraava ohjelma piirtää punaisen kolmion.

# -*- coding: utf-8 -*-
import pygame

naytto = pygame.display.set_mode((640, 400))
pygame.display.set_caption("Piirtäminen")

def main():
    while True:
        tapahtuma = pygame.event.poll()
        if tapahtuma.type == pygame.QUIT:
            break

        
        naytto.fill((0, 0, 0))
        pygame.draw.polygon(naytto, (255, 0, 0), [(0, 0), (0, 100), (100, 0)], 0)
        pygame.display.flip()

main()

Listassa olevien arvojen muuttaminen

Jokaisella listassa olevalla arvolla on paikka. Tätä paikkaa kutsutaan yleensä indeksiksi. Indeksit alkavat nollasta, eli ensimmäinen listassa oleva arvo on indeksissä nolla. Luodaan lista, jossa on kaksi arvoa, ja tulostetaan arvot.

# -*- coding: utf-8 -*-

def main():
    lista = [15, 3]
    print lista

main()
[15, 3]

Jos haluamme asettaa listan ensimmäisen arvon uudestaan, eli muuttaa indeksissä nolla olevaa arvoa, teemme sen hakasulkujen avulla. Listamuuttujan tiettyyn indeksiin pääsee käsiksi hakasulkuja käyttämällä.

# -*- coding: utf-8 -*-

def main():
    lista = [15, 3]
    print lista
    lista[0] = 42
    print lista

main()
[15, 3]
[42, 3]

Myös toisen alkion, eli indeksissä yksi olevan alkion, voi vaihtaa hakasulkujen avulla.

# -*- coding: utf-8 -*-

def main():
    lista = [15, 3]
    print lista
    lista[1] = 133
    print lista

main()
[15, 3]
[15, 133]

Listarakenteita käytetään usein hahmon tai useamman hahmon koordinaattien tallentamiseen. Alla esimerkki hahmon koordinaateista, ja koordinaattien käytöstä piirtämisessä.

# -*- coding: utf-8 -*-
import pygame

naytto = pygame.display.set_mode((640, 400))
pygame.display.set_caption("Piirtäminen")

def main():
    # hahmon x- ja y-koordinaatit
    hahmo_sijainti = [125, 75]
    hahmo_leveys = 50
    hahmo_korkeus = 100
    
    while True:
        tapahtuma = pygame.event.poll()
        if tapahtuma.type == pygame.QUIT:
            break

        naytto.fill((0, 0, 0))
        pygame.draw.rect(naytto, (255, 0, 0), (hahmo_sijainti[0], hahmo_sijainti[1], hahmo_leveys, hahmo_korkeus))
        pygame.display.flip()

main()

Takaisin pääsivulle