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()
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
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.
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 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()
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()