Osa 5

Tuple

Tuple eli monikko on listan tapainen tietorakenne. Sen olennaiset erot listaan ovat:

  • Tuple merkitään kaarisuluilla ( ja ), lista merkitään hakasuluilla [ ja ]
  • Tuple on muuttumaton, kun taas listan sisältö voi muuttua

Esimerkiksi seuraava koodi luo tuplen, jossa on pisteen koordinaatit:

piste = (10, 20)

Tuplen sisällä oleviin alkioihin viitataan samalla tavalla kuin listassa:

piste = (10, 20)
print("x-koordinaatti:", piste[0])
print("y-koordinaatti:", piste[1])
Esimerkkitulostus

x-koordinaatti: 10 y-koordinaatti: 20

Kuitenkaan tuplen määrittelyn jälkeen sen arvoa ei voi muuttaa, eli seuraava koodi ei toimi:

piste = (10, 20)
piste[0] = 15
Esimerkkitulostus

TypeError: 'tuple' object does not support item assignment

Loading
Loading

Miksi tuple on olemassa?

Tuplen ideana on tallentaa jokin kiinteä kokoelma arvoja, jotka liittyvät toisiinsa. Esimerkiksi kun tallennamme pisteen, jossa on x- ja y-koordinaatti, tuple on luonteva valinta, koska pisteeseen kuuluu aina kaksi arvoa:

piste = (10, 20)

Voisimme sinänsä tallentaa pisteen myös listana:

piste = [10, 20]

Tämä ei kuitenkaan tuntuisi yhtä hyvältä ratkaisulta, koska lista sisältää peräkkäisiä alkioita jossakin järjestyksessä ja sen koko voi muuttua. Kun tallennamme pisteen, haluamme tallentaa nimenomaan x- ja y-koordinaatin eikä listaa koordinaateista.

Koska tuple on muuttumaton, sitä voidaan käyttää sanakirjan avaimena (toisin kuin listaa). Esimerkiksi seuraava ohjelma luo sanakirjan, jonka avaimet ovat pisteitä:

pisteet = {}
pisteet[(3, 5)] = "apina"
pisteet[(5, 0)] = "banaani"
pisteet[(1, 2)] = "cembalo"
print(pisteet[(3, 5)])
Esimerkkitulostus
apina

Vastaava koodi ei toimisi, jos käyttäisimme listoja:

pisteet = {}
pisteet[[3, 5]] = "apina"
pisteet[[5, 0]] = "banaani"
pisteet[[1, 2]] = "cembalo"
print(pisteet[[3, 5]])
Esimerkkitulostus

TypeError: unhashable type: 'list'

Tuple ilman sulkuja

Tuplen määrittelyssä ei ole pakko antaa sulkuja. Esimerkiksi seuraavat koodit toimivat samalla tavalla:

luvut = (1, 2, 3)
luvut = 1, 2, 3

Tämän ansiosta voimme tehdä luontevasti funktion, joka palauttaa useita arvoja tuplena. Tarkastellaan seuraavaa esimerkkiä:

def minmax(lista):
  return min(lista), max(lista)

lista = [33, 5, 21, 7, 88, 312, 5]

pienin, suurin = minmax(lista)
print(f"Pienin luku on {pienin} ja suurin on {suurin}")
Esimerkkitulostus

Pienin luku on 5 ja suurin on 312

Tämä funktio palauttaa kaksi arvoa tuplena, ja funktion paluuarvo vastaanotetaan "yhtä aikaa" kahteen muuttujaan:

pienin, suurin = minmax(lista)

Tässä tapauksessa sijoitusoperaation vasemmalla puolella on tuple, jonka sisällä oleviin muuttujiin asetetaan funktion palauttaman tuplen sisältämät arvot:

(pienin, suurin) = minmax(lista)

Sanakirjojen yhteydessä esiteltiin items-metodiin perustuvaa tapaa käydä läpi sanakirjan kaikki avaimet ja arvot:

sanakirja = {}

sanakirja["apina"] = "monkey"
sanakirja["banaani"] = "banana"
sanakirja["cembalo"] = "harpsichord"

for avain, arvo in sanakirja.items():
    print("avain:", avain)
    print("arvo:", arvo)

Tässäkin Python käyttää taustalla tupleja: sanakirja.items() palauttaa yksi kerrallaan avain-arvo-parit tuplena, jonka ensimmäinen alkio on avain ja toinen arvo.

Vielä yksi tuplen käyttötarkoitus on kahden muuttujan arvon vaihtaminen keskenään:

luku1, luku2 = luku2, luku1

Yllä oleva koodi vaihtaa keskenään muuttujien luku1 ja luku2 arvot, eli koodi toimii samoin kuin seuraava, apumuuttujaa käyttävä koodi:

apu = luku1
luku1 = luku2
luku2 = apu
Loading
Loading
:
Loading...
:
Loading...

Kirjaudu sisään nähdäksesi tehtävän.

Vastaa lopuksi osion loppukyselyyn:

:
Loading...
:
Loading...

Kirjaudu sisään nähdäksesi tehtävän.