Python-oppimateriaali (CHEM-A2600)

Merkkijonojen käsittely listoina

Merkkijonot ovat läheistä sukua listoille. Merkkijonon voi muuntaa suoraan listaksi:

merkkijono_listana = list('Sana')
print("Merkkijono listana:", merkkijono_listana)

tulostaa

Merkkijono listana: ['S', 'a', 'n', 'a']

Merkkijonon voi siis itsessään ajatella olevan "lista merkkejä". Näin ollen myös merkkijonoja voi indeksoida ja siivuttaa:

teksti =  "Kemisti"
# indeksi: 0123456
print(teksti[0])
print(teksti[0:4])

tulostaa

K
Kemi

Merkkijonosta voi etsiä toisen merkkijonon sijainnin str.index-funktiolla:

merkkijono = "Huomio!!?"
# indeksi:    012345678
print(merkkijono.index("!!"))

tulostaa

6

Merkkijonofunktiot str.split ja str.join

Funktio str.split pilkkoo merkkijonon listaksi. Esimerkiksi:

teksti = "Sc Ti V Cr Mn Co Fe Ni Cu Zn"
alkuaineet = teksti.split()
print(alkuaineet)

tulostaa

['Sc', 'Ti', 'V', 'Cr', 'Mn', 'Co', 'Fe', 'Ni', 'Cu', 'Zn']

Oletuksena merkkijonosta poimitaan välilyönnillä erotetut alkiot. Tätä voi muuttaa sep-parametrillä:

teksti = "4, 21, 53, 12, 7, 0"
numerot = teksti.split(sep = ',')
print(numerot)

tulostaa

['4', ' 21', ' 53', ' 12', ' 7', ' 0']

Funktion str.split käänteisoperaatio on str.join. Funktiolle annetaan parametrina lista ja se yhdistää listan alkiot merkkijonoksi:

alkuaineet = ['B', 'C', 'N', 'O', 'F', 'Ne']
teksti = " ".join(alkuaineet)
print(teksti)

tulostaa

B C N O F Ne

Listan alkioiden väliin lisätään .join-funktiokutsua edeltävä merkkijono. Esimerkiksi:

alkuaineet = ['B', 'C', 'N', 'O', 'F', 'Ne']
teksti = ", ".join(alkuaineet)
print(teksti)

tulostaa

B, C, N, O, F, Ne

Merkkijonon sisällön tutkiminen merkki kerrallaan for-silmukan avulla

Pythonin dokumentaatiossa listataan useita merkkijonojen käsittelyyn tarkoitettuja funktioita. Katsotaan, kuinka merkkijonon sisältöä voi tutkia merkki kerrallaan for-silmukan avulla.

Funktiolla str.isdigit voi etsiä numeroita:

# Käydään katuosoite läpi merkki kerrallaan ja poimitaan numerot
katuosoite = "Kemistintie 23"
numerot = ""
for merkki in katuosoite:
    if merkki.isdigit():
        numerot = numerot + merkki      
print("Talon numero on", numerot)

tulostaa

Talon numero on 23

Funktiolla str.isalpha voi etsiä kirjaimia:

# Käydään postinumero läpi merkki kerrallaan ja poimitaan kirjaimet
postinumero = "02150 ESPOO"
kirjaimet = ""
for merkki in postinumero:
    if merkki.isalpha():
        kirjaimet = kirjaimet + merkki

print("Postitoimipaikka on", kirjaimet)

tulostaa

Postitoimipaikka on ESPOO

Funktioilla str.isupper ja str.islower voi tutkia, onko merkki iso vai pieni kirjain. str.isspace kertoo, onko merkki "whitespace", eli esimerkiksi välilyönti, tabulaattori tai rivinvaihto:

# Kerätään alkuainesymbolit listaan
teksti = "Sc Ti V Cr Mn Co Fe Ni Cu Zn "
alkuaineet = []
apujono = ""
# Käydään teksti läpi kirjain kerrallaan
for merkki in teksti:
    # Alkuaineen symboli alkaa aina isolla kirjaimella
    if merkki.isupper():
        # Iso kirjain talteen
        apujono = merkki
    elif merkki.islower():
        # Lisätään pieni kirjain ison alkukirjaimen perään
        apujono = apujono + merkki
    elif merkki.isspace():
        # Välilyönti erottaa symbolit, eli apujono sisältää nyt alkuainesymbolin
        # Symboli on joko (a) iso kirjain + pieni kirjain tai (b) vain iso kirjain
        alkuaineet.append(apujono)
        apujono = ""
print(alkuaineet)

tulostaa

['Sc', 'Ti', 'V', 'Cr', 'Mn', 'Co', 'Fe', 'Ni', 'Cu', 'Zn']

Tehtävä 3.8.1