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
insertKomento 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.
popYksittä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()