Osa 3

Merkkijonojen käsittely

Merkkijono-operaatiot

Olemme jo aiemmin yhdistäneet merkkijonoja +-operaattorin avulla:

alku = "esi"
loppu = "merkki"
sana = alku+loppu
print(sana)
Esimerkkitulostus

esimerkki

Myös *-operaattoria voidaan käyttää merkkijonojen yhteydessä. Jos toinen operandi kertolaskussa on merkkijono ja toinen kokonaisluku, saadaan merkkijonoa monistettua annettu määrä. Esimerkiksi:

sana = "apina"
print(sana*3)
Esimerkkitulostus

apinaapinaapina

Silmukan ja merkkijono-operaatioiden avulla voimme tehdä ohjelman, joka piirtää pyramidin:

n = 10 # pyramidin kerrosten määrä
rivi = "*"

while n > 0:
    print(" "*n+rivi)
    rivi += "**"
    n -= 1

Ohjelman tulostus on seuraava:

          *
         ***
        *****
       *******
      *********
     ***********
    *************
   ***************
  *****************
 *******************

Silmukassa oleva print-komento tulostaa rivin, jonka alussa on n välilyöntiä ja sitten muuttujan rivi sisältö. Tämän jälkeen muuttujan rivi loppuun lisätään kaksi tähteä ja muuttujan n arvo vähenee yhdellä.

Merkkijonon pituus ja indeksointi

Funktio len palauttaa kokonaisluvun, joka on merkkijonon pituus merkkeinä. Esimerkiksi len("moi") palauttaa 3, koska merkkijonossa moi on 3 merkkiä.

Seuraava ohjelma tulostaa käyttäjän syöttämän merkkijonon "alleviivattuna" monistamalla merkkiä - syötteen pituuden mukaisen määrän:

mjono = input("Anna merkkijono: ")
print(mjono)
print("-"*len(mjono))
Esimerkkitulostus

Anna merkkijono: Moi kaikki!

Moi kaikki!
-----------

Pituuteen lasketaan mukaan kaikki merkkijonossa olevat merkit, mukaan lukien välilyönnit. Niinpä merkkijonon moi moi pituus on 7.

Yksittäinen merkkijonon merkki voidaan hakea operaattorin [] avulla. Operaattori kirjoitetaan merkkijonon perään, ja hakasulkeiden väliin kirjoitetaan halutun merkin indeksi eli kohta merkkijonossa.

Huomaa, että merkkien indeksointi alkaa nollasta: ensimmäinen merkki on siis indeksin 0 kohdalla, toinen indeksin 1 kohdalla jne.

3 2 1

Esimerkiksi:

mjono = input("Anna merkkijono: ")
print(mjono[0])
print(mjono[1])
print(mjono[3])

Ohjelma tulostaa:

Esimerkkitulostus

Anna merkkijono: apina a p n

Koska merkkijonon ensimmäinen merkki on indeksin 0 kohdalla, on viimeinen merkki vastaavasti indeksin pituus – 1 kohdalla. Esimerkiksi seuraava ohjelma tulostaa merkkijonon ensimmäisen ja viimeisen merkin:

mjono = input("Anna merkkijono: ")
print("Ensimmäinen: " + mjono[0])
print("Viimeinen: " + mjono[len(mjono) - 1])
Esimerkkitulostus

Anna merkkijono: testi Ensimmäinen: t Viimeinen: i

Seuraava ohjelma puolestaan käy läpi kaikki merkkijonon merkit vasemmalta oikealle silmukan avulla:

mjono = input("Anna merkkijono: ")
kohta = 0
while kohta < len(mjono):
    print(mjono[kohta])
    kohta += 1
Esimerkkitulostus

Anna merkkijono: testi t e s t i

Pythonissa merkkeihin voi viitata myös alkaen merkkijonon lopusta käyttämällä negatiivisia indeksejä. Merkkijonon viimeinen merkki on indeksin -1 kohdalla, toiseksi viimeinen indeksin -2 kohdalla jne. Onkin kätevämpi kirjoittaa m[-1] kuin m[len(m) - 1].

3 2 2

Tämän avulla aiempi ohjelma voidaan toteuttaa paremmin näin:

mjono = input("Anna merkkijono: ")
print("Ensimmäinen: " + mjono[0])
print("Viimeinen: " + mjono[-1])
Esimerkkitulostus

Anna merkkijono: testi Ensimmäinen: t Viimeinen: i

Osajonot

Merkkijonon osajono muodostuu perättäisistä merkeistä. Esimerkiksi merkkijonon esimerkki osajonoja ovat esi, imer ja merkki.

Voimme erottaa halutussa kohdassa olevan osajonon syntaksilla [a:b], mikä tarkoittaa, että osajono alkaa kohdasta a ja päättyy juuri ennen kohtaa b. Voimme ajatella alku- ja loppukohdan merkkien vasemmalle puolelle piirretyiksi viivoiksi alla olevan kuvan mukaisesti:

3 2 3

Seuraava esimerkki esittelee osajonojen hakemista:

mjono = "saippuakauppias"

print(mjono[0:3])
print(mjono[4:10])

# jos alkukohta puuttuu, se on oletuksena 0
print(mjono[:3])
# jos loppukohta puuttuu, se on oletuksena merkkijonon pituus
print(mjono[4:])
Esimerkkitulostus

sai puakau sai puakauppias

Osajonon etsiminen

Voimme tutkia in-operaattorin avulla, onko merkkijonossa tiettyä osajonoa. Lauseke a in b on tosi, jos merkkijonossa b on osajono a.

Esimerkiksi

mjono = "testi"

print("t" in mjono)
print("x" in mjono)
print("est" in mjono)
print("ets" in mjono)
Esimerkkitulostus

True False True False

Seuraava ohjelma antaa käyttäjän etsiä merkkijonon osajonoja:

mjono = "saippuakauppias"

while True:
    osa = input("Mitä etsit? ")
    if osa in mjono:
        print("Löytyi")
    else:
        print("Ei löytynyt")
Esimerkkitulostus

Mitä etsit? kaup Löytyi Mitä etsit? abc Ei löytynyt Mitä etsit? ippu Löytyi ...

Operaattori in palauttaa tiedon osajonon esiintymisestä, muttei tietoa siitä, mistä se löytyy. Tätä varten Pythonin merkkijonoissa metodi find, joka saa parametrikseen etsittävän osajonon palauttaa joko ensimmäisen indeksin, josta osajono löytyy, tai -1, jos osajonoa ei löydy merkkijonosta.

Metodi tarkoittaa suunnilleen samaa kuin funktio, mutta se liittyy tiettyyn merkkijonoon. Metodia käytetään seuraavasti:

3 2 4

Esimerkkejä metodin käyttämisestä:

mjono = "testi"

print(mjono.find("t"))
print(mjono.find("x"))
print(mjono.find("est"))
print(mjono.find("ets"))
Esimerkkitulostus

0 -1 1 -1

Voimme myös laajentaa hakuohjelmaa näin:

mjono = "saippuakauppias"

while True:
    osa = input("Mitä etsit? ")
    kohta = mjono.find(osa)
    if kohta >= 0:
        print("Löytyi kohdasta",kohta)
    else:
        print("Ei löytynyt")
Esimerkkitulostus

Mitä etsit? kaup Löytyi kohdasta 7 Mitä etsit? abc Ei löytynyt Mitä etsit? ippu Löytyi kohdasta 2 ...

:
Loading...
:
Loading...

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

Seuraava osa: