Du er ikke logget inn. Så lenge du ikke er logget inn går du glipp av muligheten for å holde styr på din egen progresjon.

Logg inn

Valgte tags:

Filtrering:

Skriv ut:

Ordbøker 0: introduksjon

Ordbøker er en datatype, som lister, som inneholder flere elementer. Ordbøker markeres med krøllparenteser, og hvert element i ei ordbok er et par, hvor det første kalles en nøkkelverdi (key), og det andre kalles innholdsverdi (value). Innholdsverdiene kan være hva som helst: heltall, flyttall, strenger, lister, andre ordbøker, og mye mer. Nøkkelverdiene derimot, er begrenset til datatyper som ikke kan endres. Det gjelder heltall, flyttall, strenger og tupler. Vi har ikke snakket så mye om tupler. Tupler indikeres med vanlige parenteser, har fast rekkefølge, og ligner på lister, men kan ikke endres.

En ordbok kan altså se slik ut:

vaermelding = {"guhkesáiggedieđáhus":"langtidsvarsel","maŋŋebárgga":"tirsdag","biegga":"vind"}

Her er "guhkesáiggedieđáhus","maŋŋebárgga" og "biegga" nøkkelverdier, og "langtidsvarsel", "tirsdag" og "vind" er innholdsverdiene.

Vi kan ikke bruke indekser for å finne elementer i ordbøker, og vi kan ikke bruke .append() slik som hos lister. For å hente ut elementer må vi "slå opp" på en nøkkelverdi, slik:

print(vaermelding["guhkesáiggedieđáhus"])

Da får vi:

langtidsvarsel

For å legge til elementer i ordboka bruker vi lignende syntaks. Vi skriver den nye nøkkelen mellom firkantparenteser, rett etter navnet på ordboka. Så sier vi hvilken innholdsverdi den skal ha. Nøkkelen i dette tilfellet er derfor "arvi", og innholdsverdien er "regn".

vaermelding["arvi"] = regn

Hvis vi vil endre på en verdi, så gjør vi det på samme måten. Det kan ikke være to like nøkkelverdier i ei ordbok, så hvis vi prøver å legge til noe på samme nøkkelverdi, så overskriver vi innholdsverdien som var der fra før av.

Det finnes allikevel tilfeller der vi har innholdsverdier som kan oppdateres. Disse fungerer som vanlig, men det kan virke litt uvant. Si vi har ei ordbok der innholdsverdien er heltall. I dette tilfellet frekvenser.

frekvenser = {'det': 25, 'er': 25, 'og': 24, 'i': 23, 'på': 23, 'av': 18}

Si vi har funnet en ny forekomst av ordet "det". Da må vi øke innholdsverdien til det, som nå er 25, med 1:

frekvenser["det"] += 1

Ordbøker 1: å legge til og å slå opp

I disse oppgavene skal du bruke ordbøker.

a) Lag ei ordbok med ordene i 1) som nøkkelverdier, og ordene i 2) som innholdsverdier, og skriv den ut til terminalen.

1) jeg, ost, på
2) PRO, N, PREP

b) Gitt ordboka under, lag et program som tar inn et ord fra brukeren og oversetter det ved å slå opp i ordboka. Sjekk om ordet brukeren skriver finnes i ordboka, og skriv ut en passende melding hvis det ikke gjør det.

ordbok = {'ku': 'cow', 'sau': 'sheep', 'hest': 'horse', 'gris': 'pig', 'kylling': 'chicken', 'geit': 'goat'}

c) Ordene under tilhører tre klasser: de som inneholder minst én "a", de som inneholder minst én "e", og de som ikke inneholder noen av delene. Lag ei ordbok med en passende nøkkel for hver av de tre klassene. Innholdsverdien til hver nøkkel skal være ei liste med ordene som hører til kategorien. Iterer gjennom lista og legg ordene til i riktig kategori. Skriv ut ordboka til terminalen til slutt.

liste = ['morild', 'liv', 'siv', 'nord', 'bord', 'kar', 'karius', 'baktus', 'erme', 'iris', 'loke', 'ernæring', 'asfalt', 'argon', 'xenon']
Vis løsningsforslag

a)

min_ordbok = {'jeg': 'PRO', 'ost': 'N', 'på': 'PREP'}

Utskrift:

{'jeg': 'PRO', 'ost': 'N', 'på': 'PREP'}

b)

ordbok = {'ku': 'cow', 'sau': 'sheep', 'hest': 'horse', 'gris': 'pig', 'kylling': 'chicken', 'geit': 'goat'}

svar = input("Skriv ordet du vil oversette.\n")
if svar in ordbok:
    print(svar, "på engelsk, er:",ordbok[svar])
else:
    print("Vi fant ikke ordet i ordboka.")
>>>Skriv ordet du vil oversette.
ku
>>>ku på engelsk, er: cow

Det finnes en metode som kan gjøre det å sjekke om et element finnes i ei ordbok lettere. Den heter .get(). Den returnerer en default-verdi så vi slipper å skrive et boolsk uttrykk. Vi skal komme tilbake til den senere.

c)

Her har vi bare kalt klassene "a","e" og "ingen", men det har selvsagt ingenting å si hva dere kaller dem. Det viktigste er måten man legger til elementer når innholdsverdiene er lister.

liste = ['morild', 'liv', 'siv', 'nord', 'bord', 'kar', 'karius', 'baktus', 'erme', 'iris', 'loke', 'ernæring', 'asfalt', 'argon', 'xenon']

ny_ordbok = {"a":[],"e":[],"ingen":[]}

for ordet in liste:
    if "a" in ordet:
        ny_ordbok["a"].append(ordet)
    elif "e" in ordet:
        ny_ordbok["e"].append(ordet)
    else:
        ny_ordbok["ingen"].append(ordet)
print(ny_ordbok)

Utskrift:

{'a': ['kar', 'karius', 'baktus', 'asfalt', 'argon'], 'e': ['erme', 'loke', 'ernæring', 'xenon'], 'ingen': ['morild', 'liv', 'siv', 'nord', 'bord', 'iris']}

Regex 0: intro

Regulære uttrykk er omfattende, og vi vil her kun ta en kjapp oppsummering av hvordan de fungerer i Python. Du kan lese den opprinnelige oppgavesamlingen med forklaringer på denne siden.

"re" er et av bibliotekene som følger med Python. Det betyr at vi ikke trenger å installere noe ekstra, men vi må importere biblioteket. Vi skriver da følgende øverst i koden:

import re

Før du fortsetter kan det være lurt å sette seg inn i noen av de vanligste metodene til re: findall, search, substitute. Det er viktig å merke seg at disse ikke alltid behandler alle regulære uttrykk likt, så noen uttrykk kan fungere godt i noen metoder, men ikke i andre.

Sett deg inn i hva forskjellen på grådige (greedy) og ikke-grådige (non-greedy) uttrykk er. I hovedsak vil grådige uttrykk prøve å finne den lengste mulige strengen. * og + er i utgangspunktet grådige, men vi kan bruke ?* og ?+ for å gjøre dem ikke-grådige.

Sett deg inn i bakoverreferanser. Det er spesielt nyttig i sammenheng med subsitute-metoden re.sub(). Vi gjør det ved at vi putter uttrykk inn i "vanlige" parenteser, og så bruker \1, \2 osv. for å referere til dem i rekkefølge.

Eksempel:

import re

streng = "hund rev fugl katt"
nystreng = re.sub(r"(\w+)",r"\1er",streng)
print(nystreng)

Utskrift:

'hunder rever fugler katter'

Grunnen til at det er r foran strengene er for at de skal tolkes som "raw", fordi "\1" gjøres om til et annet symbol før re for se den.

Lykke til, og kom gjerne med tilbakemeldinger!

Regex 1

Findall

I disse oppgavene skal du bruke re.findall(). re.findall tar et regulært uttrykk som første argument, og en streng som andre argument, og returnerer ei liste med alle tilfellene som matcher. I oppgavene under trenger du ikke å dele opp teksten, les den inn som én streng, men gjør den om til små bokstaver.

Teksten som er til disse oppgavene er denne, fra NRK:

Teksten er her

Det er best å lese inn fila, men du kan også bare kopiere hele som en streng, selv om den er litt stor.

Oppgave 1
Bruk re.findall i teksten til å svare på spørsmålene under. OBS! Gjør om hele teksten til små bokstaver i denne oppgaven.

I oppgaven under ser vi forenklende på et "ord" som noe som er omringet av mellomrom, tegnsetting eller linjeskift på hver side.

a)
Hvor mange tilfeller av vokalgrafemer er det i teksten? Hvor mange tilfeller er det med to vokalgrafemer etter hverandre? Hvor mange med tre? (Se bort ifra at det kan være lånord i teksten, og tenk på vokalene som aeiouyæøå.)

b)
Gjør det samme som i a), men sjekk faktiske ord. Hvor mange ord inneholder minst én vokal? Hvor mange inneholder minst to? Og hvor mange inneholder minst tre? Er tallene annerledes enn for a) Hvis de er det, hvorfor blir det sånn?

c)
Hvor mange ord i teksten inneholder minst én 'e'?
Hvor mange ord inneholder minst én 'å'?
Hvor mange ord inneholder kombinasjonen 'ere'?

d)
Hvor mange ord inneholder minst to konsonanter?
Hvor mange ord inneholder minst tre konsonanter?
Skriv ut ei liste med ordene med minst tre konsonanter, og gjør en liten endring i uttrykket slik at du kan skrive ut ei liste med bare konsonantkombinasjonene i de ordene.

Vis løsningsforslag

Oppgave 1

fila = open("nrk.txt","r",encoding="utf-8")
teksten = fila.read().lower()
fila.close()

a1 = re.findall(r'[aeiouyæøå]{1}',teksten)
a2 = re.findall(r'[aeiouyæøå]{2}',teksten)
a3 = re.findall(r'[aeiouyæøå]{3}',teksten)

print("Antall enkeltstående vokaler:",len(a1))
print("Antall doble vokaler:",len(a2))
print("Antall tredoble vokaler:",len(a3))


b1 = re.findall(r'\w*[aeiouyæøå]{1}\w*',teksten)
b2 = re.findall(r'\w*[aeiouyæøå]{2}\w*',teksten)
b3 = re.findall(r'\w*[aeiouyæøå]{3}\w*',teksten)

print("Ord med minst en vokal:", len(b1))
print("Ord med minst to vokaler:", len(b2))
print("Ord med minst tre vokaler:", len(b3))

c1 = re.findall(r'\w*e\w*',teksten)
c2 = re.findall(r'\w*ere\w*',teksten)
c3 = re.findall(r'\w*å\w*',teksten)

print("Ord med minst en e:", len(c1))
print("Ord med ere:", len(c2))
print("Ord med minst en å:", len(c3))

d1 = re.findall(r'\w*[b-df-hj-np-tv-xz]{2}\w*',teksten)
d2 = re.findall(r'\w*[b-df-hj-np-tv-xz]{3}\w*',teksten)
print(d2)
d3 = re.findall(r'\w*([b-df-hj-np-tv-xz]{3})\w*',teksten)
print("Ord med minst to konsonanter på rad:",len(d1))
print("Ord med minst tre konsonanter på rad", len(d2))
print("Kombinasjoner med tre konsonanter",d3)

Å bruke bindestrek lar oss korte ned noen uttrykk. Bindestreken betyr "alt mellom", og brukes inne i firkantparentesene, så [a-d] er det samme som [abcd]. Rekkefølgen er alfabetisk. Over kunne vi også skrevet ut hele: [bcdfghjklmnpqrstvwxz], det er faktisk bare fire tegn mer å skrive.

En måte å skrive konsonanter på kunne være å skrive [^aeiouyæøå], det betyr "alle tegn som ikke er aeiouyæøå", men problemet er at da får man også med andre tegn som mellomrom og forskjellig tegnsetting.

Utskrift:

Antall enkeltstående vokaler: 1104
Antall doble vokaler: 34
Antall tredoble vokaler: 1

Ord med minst en vokal: 564
Ord med minst to vokaler: 32
Ord med minst tre vokaler: 1

Ord med minst en e: 324
Ord med ere: 29
Ord med minst en å: 55

['valgte', 'ingeniørstudiet', 'samisklærer', 'nrk', 'innså', 'oppdaget', 'lærerstudiet', 'språket', 'nrk', 'nrk', 'lærerstudiet', 'forstå', 'skru', 'bangkok', 'valgte', 'samisklærer', 'samisklærer', 'språket', 'samisklærere', 'rundt', 'samisklærere', 'nsr', 'sametingsrådet', 'sametingrådskollega', 'nsr', 'grunnskolen', 'utdanningsdirektoratet', 'stipendordning', 'grunnskolelærere', 'stipendpotten', 'utfordre', 'ungdom', 'kunnskaps', 'integreringsminister', 'samisklærere', 'venstre', 'ønsker', 'samisklærere', 'kunnskaps', 'integreringsminister', 'skjul', 'først', 'fremst', 'språket', 'utdanningsstadiet', 'språket', 'gjenstår', 'oppfylt', 'ønsket', 'ønsker', 'mestringen']

Ord med minst to konsonanter på rad: 304
Ord med minst tre konsonanter på rad 51
Kombinasjoner med tre konsonanter ['lgt', 'rst', 'skl', 'nrk', 'nns', 'ppd', 'rst', 'spr', 'nrk', 'nrk', 'rst', 'rst', 'skr', 'ngk', 'lgt', 'skl', 'skl', 'spr', 'skl', 'ndt', 'skl', 'nsr', 'gsr', 'dsk', 'nsr', 'nsk', 'gsd', 'rdn', 'nsk', 'ndp', 'rdr', 'ngd', 'nsk', 'gsm', 'skl', 'str', 'nsk', 'skl', 'nsk', 'gsm', 'skj', 'rst', 'mst', 'spr', 'sst', 'spr', 'nst', 'ppf', 'nsk', 'nsk', 'str']

Regex 3

Match

Match finner ut om en streng matcher fra starten av strengen.

Oppgave 1
Får uttrykkene nedenfor treff i strengene de testes på? matcher de hele strengen? Hvilke feil får vi eventuelt?

Deloppgave a

re.match('e.*','melk')

Deloppgave b

re.match('o.*','ost')

Deloppgave c

re.match('e{2}.*','eller')

Deloppgave d

re.match('.*r','eller')

Deloppgave e

re.match('.*r','brød')
Vis løsningsforslag

a)
None

Match sjekker alltid fra starten av strengen. Siden '.'-symbolet kommer etter 'e' så har ikke match mulighet til å finne noe som treffer. Hvis vi hadde skrevet '.*e' så ville vi fått et treff på 'me'.

b) Treff på hele ordet 'ost'.

c)
Ingen treff. {} brukes til å vise hvor mange repetisjoner vi skal ha. Det er ingen tilfeller av 'ee' i strengen, og derfor er det ingen treff.

d)
Vi får treff på hele ordet 'eller'.

e)
Vi får treff på deler av strengen: 'br'. 'ød' kommer ikke med fordi vi har kun spesifisert at vi vil treffe på alt mulig fram til og med første forekomst av en

Regex 4

Search

Search ligner på match, bare at search returnerer det første treffet i strengen som helhet, ikke bare i starten av strengen. Det gir bare ett match per streng.

En ting som er verdt å merke seg med search, er at den returnerer et match-objekt. Vi kan bruke metoden .group() for å få tak i strengene som matcher. Ei gruppe (group) er enten hele uttrykket, eller deler av uttrykket som vi spesifiserer med parenteser.

Eksempel:

strengen = "Vi liker nltk"
m = re.search(r"liker (\w*)",strengen)
print(m.group(0))
print(m.group(1))

Her vil .group(0) referere til hele uttrykket, mens .group(1) vil kun referere til det som er inni parantesene vi har skrevet selv, så utskriften blir:

liker nltk
nltk

Til disse oppgavene skal du bruke re.search(), og følgende tekst:

Pride and Prejudice

I begge oppgavene skal du åpne filobjektet, lese fila og splitte den opp på punktum ("."). Du kan gjøre teksten om til små bokstaver.

Oppgave 1

I oppgavene må du gå gjennom alle setningene du har delt opp, og lagre funnene dine i en liste eller lignende.

Prøv å finne og skrive ut alle tilfeller av tredjepersonspronomen i entall (he, she, it) direkte etterfulgt av et verb, som for eksempel "she eats".

Hva gjør det enklere å sjekke dette enn om vi hadde spurt om førsteperson eller andreperson, for eksempel? Hva må vi tenke på når det gjelder verbet?

Hvilke verb i tredjeperson er det vi ikke får med oss?

Oppgave 2

Når vi søker etter ord kan det være interessant å få med konteksten rundt ordene. Skriv en funksjon som tar inn et søkeord og et tall n, og returnerer ordet med N antall naboord på både høyre og venstre side. Funksjonen skal gå igjennom hver setning og skrive ut hvis ordet er i setningen OG det er nok naboer til å oppfylle kravet til antall naboord.

Prøv å kalle metoden med følgende argumenter:
she,3
she,4
i,5
darcy,2

Vis løsningsforslag

Oppgave 1

fila = open("austen.txt","r",encoding="utf-8")
teksten = fila.read().lower().split(".")
fila.close()

phrases = []
for linje in teksten:
    m = re.search(r"\s((she|he) \w+s) ", linje)
    if m:
        phrases.append(m.group(1))
print(phrases)

Utskrift:

['he is', 'he comes', 'he chooses', 'she is', 'she was', 'she was', 'she has', 'she is', 'he was', 'he was', 'he was', 'he was', 'she is', 'he was', 'she was', 'she was', 'he is', 'she was', 'she was', 'he is', 'he was', 'he was', 'he was', 'he was', 'he was', 'he is', 'he is', 'he is', 'he has', 'she was', 'she was', 'she was', 'she was', 'he was', 'she was', 'she was', 'she was', 'he is', 'he has', 'he is', 'he is', 'he deserves', 'she was', 'he was']

På engelsk er det ingen egne morfologiske kjennetegn på de fleste verb i første- og andreperson, mens tredjepersonsformen slutter på -s. Det gjør det lettere.

Vi får naturligvis ikke med oss verb som ikke kommer rett etter pronomenet, som for eksempel "he still loves".

Oppgave 2

fila = open("austen.txt","r",encoding="utf-8")
teksten = fila.read().lower().split(".")
fila.close()

def kontekst(word, n):
    for line in teksten:
        pattern = r"\w* " * n + word + r" \w*" * n
        m = re.search(pattern,line)
        if m:
            print(m.group(0))
    print()

kontekst("she",3)
kontekst("she",4)
kontekst("i",5)
kontekst("darcy",2)

Utskrift:

i am sure she is not half
it was what she had expected all
as soon as she entered the room
another intreaty that she would be serious
 but now she would no longer
kitty owned that she had rather stay
 but whether she were violently set
the table where she was sitting with
how earnestly did she then wish that
 but before she had been three

and i am sure she is not half so
that it was what she had expected all the
approached the table where she was sitting with kitty

known as much this morning i certainly would not have called
this is the last time i shall ever remember it myself
 you will only think i feel more than i ought

him and darcy there was
endeared to darcy by the
 but darcy was clever

Slicing 0: introduksjon

Slicing er det vi kaller når vi bruker indekser til å indikere en mindre liste innad i lista vi jobber med. Slicing brukes også på strenger.

Forskjellen mellom bare å bruke indekser og slicing, er at vi bruker kolon for å indikere fra hvor og til hvor vi skal dele opp lista eller strengen. Den deler da opp fra og med tallet før kolon, til men ikke inkludert tallet etter kolon.

Eksempel:

liste = ["a","b","c","d","e","f","g"]
print(liste[1:2])
print(liste[3:5])

Utskrift:

['b']
['d', 'e']

Hvis vi utelater tallet før kolon så betyr det "fra starten", altså det samme som å skrive 0, og hvis vi utelater tallet etter betyr det "helt fram til slutten", altså det samme som å skrive lengden på strengen/lista, altså én mer enn den høyeste indeksen.

Eksempel:

liste = ["a","b","c","d","e","f","g"]
print(liste[3:])
print(liste[:3])

Utskrift:

['d', 'e', 'f', 'g']
['a', 'b', 'c']

Leg merke til at elementet på indeks 3, "d", er med når vi skriver [3:], men ikke når vi skriver [:3], som forklart over.

Vi kan også bruke negative indekser. Da teller vi fra slutten av lista/strengen, men vi begynner på -1.

Eksempel:

strengen = "ostekake"
print(strengen[-4:])
print(strengen[2:-2])

Utskrift:

kake
teka

Slicing 1: oppgaver

Disse oppgavene går ut på å jobbe med enkel slicing.

a) Hvordan kan du dele opp følgende strenger for å finne ordene under. Prøv å ikke bruke negative indekser. Du kan eventuelt prøve å bruke negative indekser etter du har prøvd uten.

a1) "kake" fra "kaker"
a2) "minfil" fra "minfil.py"
a3) "utskrift" fra "utskrift.txt"
a4) ".csv" fra "statistikk.csv"
a5) "gang" fra "inngangsdør"

b) Bruk kun negative indekser til å finne følgende. Du kan utelate et av tallene på en av sidene eller begge av kolon hvis det gjør det enklere.

b1) "le" fra "eplene"
b2) "kake" fra "kakespade"
b3) ".tsv" fra "datafil.tsv"
b4) "saltkringle" fra "saltkringler"

c) Lag et program der brukeren skriver en streng, og så to tall. Pass på at begge tallene er gyldige indekser i strengen, så du ikke får en "index out of range"-feilmelding. Skriv så ut den biten av strengen til brukeren ved å bruke slicing fra det første tallet, til det andre. Husk at input()-funksjonen kun gir oss (returnerer) strenger.

Vis løsningsforslag

Løsningsforslag

a)

Når vi skal ha med det første tegnet har vi muligheten mellom å skrive 0 eller utelate 0 og la plassen før kolon stå tom. Det gir helt samme resultat, og det er vanlig å ikke skrive 0.

print("kaker"[:4])
print("kaker"[0:4])
print("minfil.py"[0:6])
print("minfil.py"[:6])
print("utskrift.txt"[0:8])
print("utskrift.txt"[:8])
print("statistikk.csv"[10:14])

Utskrift:

kake
minfil
minfil
utskrift
utskrift
.csv

Hvis strengen er lagret som en variabel (som den som regel er), kan vi enkelt bruke lengden for å finne den siste indeksen:

filnavn = "statistikk.csv"
print(filnavn[10:len(filnavn)])

Utskrift:

.csv

med negative indekser:

print("kaker"[:4])
print("minfil.py"[0:-3])
print("utskrift.txt"[0:-4])
print("statistikk.csv"[-4:])

Utskrift:

kake
minfil
utskrift
.csv

b)

print("eplene"[-4:-2])
print("kakespade"[-9:-5])
print("datafil.tsv"[-4:])
print("saltkringler"[-12:-1])

Utskrift:

le
kake
.tsv
saltkringle

Hvis vi har "kakespade" og "saltkringler" som variabler, kan vi gjøre følgende:

str1 = "kakespade"
str2 = "saltkringler"

print(str1[-len(str1):-5])
print(str2[-len(str2):-1])

Utskrift:

kake
saltkringle

Det kan være styr å måtte regne ut lengden av strengen, derfor er det veldig greit at vi kan bruke de negative indeksene når vi vet hvor mange steg fra slutten av strengen eller lista vi skal gå bakover.

c)

Koden under er et minimalt forslag. Vi kunne tatt større hensyn til at brukeren skriver inn tall som ikke kan konverteres, og vi kunne sjekket om begge tallene har feil eller bare det ene.

streng = input("Skriv en streng.\n")
tall1 = input("Skriv indeksen strengen skal begynne fra.\n")
tall2 = input("Skriv indeksen strengen skal slutte før.\n")
tall1 = int(tall1)
tall2 = int(tall2)
if tall1 < len(streng) - 1 and tall2 < len(streng):
    print("Den nye strengen er:",streng[tall1:tall2])
else:
    print("Tallene dine er ikke gyldige.")

Vi må sjekke om det første tallet er lengden av strengen minus 1, fordi vi tar fra dette tallet. Det andre tallet kan være lik lengden, siden det er til men ikke inkludert tallet.

Utskrift:

Med tall som er innenfor:

Skriv indeksen strengen skal begynne fra.
2
Skriv indeksen strengen skal slutte før.
5
Den nye strengen er: kes

Med gale tall:

Skriv en streng.
kakespade
Skriv indeksen strengen skal begynne fra.
2
Skriv indeksen strengen skal slutte før.
9
Tallene dine er ikke gyldige.

Strenger 0: intro

Disse oppgavene er basert på PDF-en som legges ut som gruppeoppgaver uke 1. Det viktigste gjentas her. Les den for å få en innføring. Disse første oppgavene er ment som oppfordring til å utforske datatypene.

Strenger

Strenger kan blant annet representere ord, setninger, avsnitt og lengre tekster. De markeres med enkle eller doble anførselstegn.

Bli-kjent-oppgave 1
Opprett noen strengvariabler og skriv dem ut til terminalen. Bekreft for deg selv at du kan bruke både doble ("") og enkle ('') anførselstegn. Test at du kan ha anførselstegn som tegn inne i en streng så lenge de ytterste anførselstegnene er annerledes.

Bli-kjent-oppgave 2
Prøv å opprette en strengvariabel der strengen går over flere linjer. For å gjøre dette må du bruke tre anførselstegn etter hverandre ("""""")/(''''''). Ofte bruker vi fillesing når vi jobber med (veldig) lange strenger, så vi slipper å ha veldig lange strenger i samme fil hvor vi skriver kode.

Strenger 1: å telle elementer i strenger

I disse oppgavene skal du lære å telle i strenger.

Tell, ved å bruke metoden count(), følgende elementer i strengene under.

a) Hvor mange 'e'-er er det i strengen under? Skriv ut svaret til terminalen.
b) Hvor mange 'n'-er er det i strengen under? Skriv ut svaret til terminalen.

strengen = "fengselstjenestemannsforbundet og menneskerettighetsorganisasjonen"

c) Hvor mange mellomrom er det i strengen under? Skriv ut svaret til terminalen.

strengen = "Språkteknologi handler om å få datamaskiner til å bruke og forstå menneskelig språk."

d) Hvor mange enkle anførselstegn er det i strengen under? Skriv ut svaret til terminalen.

strengen = "'Språkteknologi' handler om å få 'datamaskiner' til å bruke og forstå 'menneskelig språk'."

e) Hvor mange linjeskift ('\n') er det i strengen under? Skriv ut svaret til terminalen.
f) Hvor mange tilfeller av bokstavsammensetningen 'ei' er det i teksten under? Skriv ut svaret til terminalen.

strengen = """Var olds ophav,
der Yme bygde,
var ei sand, ei sø,
ei svale bølger;
jord ei fandtes,
oven ei himmel
- Ginnungagab -
græs ei spired. """
Vis løsningsforslag

Noen eksempler til bli-kjent-oppgave 1 og 2

min_streng = "paiform"

min_streng = 'paiform'

min_streng = """paiform
                flere
                paiformer"""


min_streng = '''paiform
                flere
                paiformer'''

Løsningsforslag til oppgave a og b:

#a) Hvor mange 'e'-er er det i strengen under? Skriv ut svaret til terminalen.
#b) Hvor mange 'n'-er er det i strengen under?

strengen1 = "fengselstjenestemannsforbundet og menneskerettighetsorganisasjonen"

antall_e = strengen1.count("e")
print("Antall e-er:", antall_e)

antall_n = strengen1.count("n")
print("Antall n-er:", antall_n)

Utskrift:

Antall e-er: 12
Antall n-er: 10

Løsningsforslag til oppgave c:

#c) Hvor mange mellomrom er det i strengen under?


strengen2 = "Språkteknologi handler om å få datamaskiner til å bruke og forstå menneskelig språk."

antall_mellomrom = strengen2.count(" ")
print("Antall mellomrom:", antall_mellomrom)

Utskrift:

Antall mellomrom: 12

Løsningsforslag til oppgave d:

#d) Hvor mange enkle anførselstegn er det i strengen under?


strengen3 = "'Språkteknologi' handler om å få 'datamaskiner' til å bruke og forstå 'menneskelig språk'."

antall_anfoerselstegn = strengen3.count("'")
print("Antall anførselstegn:",antall_anfoerselstegn)

Utskrift:

Antall anførselstegn: 6

Løsningsforslag til oppgave e og f:

#e) Hvor mange linjeskift ('\n') er det i strengen under?
#f) Hvor mange tilfeller av bokstavsammensetningen 'ei' er det i teksten under?

strengen4 = """Var olds ophav,
der Yme bygde,
var ei sand, ei sø,
ei svale bølger;
jord ei fandtes,
oven ei himmel
- Ginnungagab -
græs ei spired. """


antall_linjeskift = strengen4.count("\n")
print("Antall linjeskift:",antall_linjeskift)

antall_ei = strengen4.count("ei")
print("Antall tilfeller av 'ei':",antall_ei)

Utskrift:

Antall linjeskift: 7
Antall tilfeller av 'ei': 6

I svarene kunne de doble anførselstegnene vært enkle uten at det har noe å si.

Strenger 2: å dele opp strenger i lister

For å dele opp strenger i mindre biter, kan vi bruke metoden .split(). Dette er en metode som brukes mye og som er fin å bli kjent med. Husk at .split() returnerer ei liste. Det vil si at resultatet av å bruke .split() på en streng er ei liste.

Eksempel

strengen = "ananas på pizzaen"
liste_med_ord = strengen.split(" ") 
print(liste_med_ord)

Utskrift:

['ananas', 'på', 'pizzaen']

Vi har altså en streng, "ananas på pizzaen", og kaller metoden .split(), som gjør den om til ei liste basert på kriteriet vi gir, som i dette tilfellet er et mellomrom. Så lagrer vi lista vi får i variabelen som heter liste_med_ord.

Oppgaver:

a) Del opp følgende streng etter mellomrom og skriv ut den resulterende lista til terminalen.

streng1 = "Jeg liker ansjos på brødskiva ."

b) Del opp følgende streng etter tabulatortegn og skriv ut den resulterende lista til terminalen.

streng2 = "brød\tgulrøtter\tpoteter\terter\tnøtter\"

c) Del opp følgende streng etter bokstaven "e", og skriv ut den resulterende lista til terminalen.

streng3 = "spise sove lese spise sove lese gjenta eksamen"

d) Del opp følgende streng uavhengig av hva slags "tomrom" det er mellom ordene. (Hint: ikke spesifiser noen streng i metoden). Skriv lista til terminalen.

streng4 = "kjære dagbok:\ni dag leste jeg\t10\tsider i:\nJurafsky og Martin!\n!"

e) Se på strengen under, og del den opp etter linjeskift, tabulering og begge. Skriv ut de tre listene til terminalen og se på forskjellen.

tekst = """ku\tcow
sau\tsheep
ull\twool"""
Vis løsningsforslag

a)

streng1 = "Jeg liker ansjos på brødskiva ."
mellomrom_splittet = streng1.split(" ")
print(mellomrom_splittet)

Utskrift:

['Jeg', 'liker', 'ansjos', 'på', 'brødskiva', '.']

b)

streng2 = "brød\tgulrøtter\tpoteter\terter\tnøtter"

tab_splittet = streng2.split("\t")
print(tab_splittet)

Utskrift:

['brød', 'gulrøtter', 'poteter', 'erter', 'nøtter']

c)

streng3 = "spise sove lese spise sove lese gjenta eksamen"

print(streng3.split("e"))

Utskrift:

['spis', ' sov', ' l', 's', ' spis', ' sov', ' l', 's', ' gj', 'nta ', 'ksam', 'n']

d)

streng4 = "kjære dagbok:\ni dag leste jeg\t10\tsider i:\nJurafsky og Martin!\n!"

alle_splittet = streng4.split()
print(alle_splittet)

Utskrift:

['kjære', 'dagbok:', 'i', 'dag', 'leste', 'jeg', '10', 'sider', 'i:', 'Jurafsky', 'og', 'Martin!', '!']

e)

tekst = """ku   cow
sau sheep
ull wool"""
linje_splittet = tekst.split("\n")
tab_splittet = tekst.split("\t")
alle_splittet = tekst.split()
print(linje_splittet, tab_splittet, alle_splittet)

Utskrift:

['ku   cow', 'sau sheep', 'ull wool'] ['ku   cow\nsau sheep\null wool'] ['ku', 'cow', 'sau', 'sheep', 'ull', 'wool']

Strenger 3: å sjekke hva en streng slutter på

Metoden .endswith() er en praktisk måte å sjekke om en streng slutter på en gitt streng. Den returnerer en boolsk verdi, det vil si enten True eller False.

Eksempel:

strengen = "ostekake"
slutter_paa_ake = strengen.endswith("ake")
print(slutter_paa_ake)

Utskrift:

True

Vi ser at det er sant at "ostekake" slutter på delstrengen "ake". Vi får derfor den boolske verdien True når vi kaller på (bruker) .endswith("ake"), og lagrer den verdien i variabelen slutter_paa_ake.

Oppgaver

a) Bruk .endswith for å sjekke om strengene under slutter på "er"

str1 = "forteller"
str2 = "epler"
str3 = "kake"
str4 = "bever"
str5 = "ost"

b) Skriv et lite program som tar input fra brukeren én gang, og skriver "Ja" til terminalen hvis inputen fra brukeren slutter på "mat", eller skal den skrive "Nei."

Vis løsningsforslag

a)

str1 = "forteller"
str2 = "epler"
str3 = "kake"
str4 = "bever"
str5 = "ost"

svar_str1 = str1.endswith("er")
svar_str2 = str2.endswith("er")
svar_str3 = str3.endswith("er")
svar_str4 = str4.endswith("er")
svar_str5 = str5.endswith("er")

print(svar_str1)
print(svar_str2)
print(svar_str3)
print(svar_str4)
print(svar_str5)

Utskrift:

True
True
False
True
False

Denne typen oppgave ville vært lettere med løkker. Vi kunne gått gjennom alle ordene hvis de var i ei liste, men det er ikke poenget i denne oppgaven.

b)

svar = input("Skriv et ord.\n")
if svar.endswith("mat"):
    print("Ja.")
else:
    print("Nei.")

Linjeskiftet ("\n") på slutten av setningen er bare for at brukeren skal kunne skrive svaret på ei ny linje.

Testkjøring 1:

>>>Skriv et ord.
automat
>>>Ja.

Testkjøring 2:

>>>Skriv et ord.
dynetrekk
>>>Nei.

Strenger 4: store og små bokstaver

Når vi jobber med tekst er det stort sett en blanding av store og små bokstaver. For Python er de store og små bokstavene forskjellige, men ofte vil vi behandle for eksempel "jeg" og "Jeg" sammen. Det kan være når vi vil telle antall ganger et ord forekommer i en tekst, eller hvis vi skal lage en liste med setninger som inneholder lemmaet (ordet) "jeg", for eksempel.

For å fikse dette kan vi bruke metoden .lower(), som tar en streng og gjør alle tegnene om til små bokstaver hvis det er mulig.

Eksempel:

tekst = "Hey , Google ! Gjør obligene mine for MEG !"

liten_tekst = tekst.lower()
print(liten_tekst)

Utskrift:

hey , google ! gjør obligene mine for meg !

Metoden .upper() gjør det motsatte; den gjør om strengene til store bokstaver.

Oppgaver

a) Gjør om følgende strenger til små bokstaver:

str1 = "SPRÅKTEKNOLOGI"
str2 = "En Veldig Behagelig Overskrift"
str3 = "jEg vIl hA pOtEtMos"

b) Gjør om følgende strenger til store bokstaver:

str4 = "hviskeleken"
str5 = "sKRIV sÅNN hELE tIDEN"
str6 = "hVa eR cAps LoCk?"

c) Skriv et program som gjør følgende: Be brukeren først om å skrive et ord eller en setning. Spør så brukeren om de vil at teksten skal skrives med bare store eller bare små bokstaver, og skriv ut teksten etter brukerens instrukser.

Vis løsningsforslag

a)

str1 = "SPRÅKTEKNOLOGI"
str2 = "En Veldig Behagelig Overskrift"
str3 = "jEg vIl hA pOtEtMos"

str1_liten = str1.lower()
str2_liten = str2.lower()
str3_liten = str3.lower()

print(str1_liten)
print(str2_liten)
print(str3_liten)

Utskrift:

språkteknologi
en veldig behagelig overskrift
jeg vil ha potetmos

b)

str4 = "hviskeleken"
str5 = "sKRIV sÅNN hELE tIDEN"
str6 = "hVa eR cAps LoCk?"

str4_stor = str4.upper()
str5_stor = str5.upper()
str6_stor = str6.upper()

print(str4_stor)
print(str5_stor)
print(str6_stor)

Utskrift

HVISKELEKEN
SKRIV SÅNN HELE TIDEN
HVA ER CAPS LOCK?

c)

tekst = input("Skriv noe!")
store_eller_smaa = input("skriv 'upper' eller 'lower'!")
if store_eller_smaa == "upper":
    print(tekst.upper())
else:
    print(tekst.lower())

Testkjøring 1:

>>>Skriv noe!
kattEN
>>>skriv 'upper' eller 'lower'!
upper
>>>KATTEN

Testkjøring 2:

>>>Skriv noe!
MIN OST
>>>skriv 'upper' eller 'lower'!
lower
>>>min ost

Her har vi ikke tatt hensyn til variasjon i brukerinput. Det kan hende brukeren skriver feil eller skriver noe helt annet. Det er selvsagt fint om man tar hensyn til slike ting også.