Ordbøker#
Ordbøker (dictionaries) er samlinger av objekter, som lister, tupler og mengder.
I Lister lagrer vi data i en rekkefølge. I ordbøker lagrer vi data i par med keys
og values
. En nøkkel er forbundet med sin verdi.
land = {"NO" : "Norge", "SE" : "Sverige"}
print(land["NO"])
print(land["SE"])
Norge
Sverige
I koden over lager vi landkoder. "NO"
og "SE"
er keys, og "Norge"
og "Sverige"
er de tilhørende verdiene. Vi knytter sammen keys og verdiene med kolon :
. For å hente verdier fra ordboken land
så skriver vi inn en key med land["NO"]
og så får vi ut verdien "Norge"
.
Dersom vi skal sette sammen en enkel ordbok så er det vanlig å gjøre det over flere linjer. Det er litt mer oversiktlig enn eksemplet over.
land = {
"NO" : "Norge",
"SE" : "Sverige"
}
Legge til, endre og fjerne data#
For å legge til data så setter vi en ny nøkkel lik en verdi.
land = {} # Tom ordbok
land["NO"] = "Norge" # Verdien "Norge" legges inn i ordboken under nøkkelen "NO"
land["DK"] = "Danmark" # Verdien "Danmark" legges inn i ordboken under nøkkelen "DK"
print(land)
{'NO': 'Norge', 'DK': 'Danmark'}
For å endre på data kan vi sette en eksisterende nøkkel til en ny verdi.
land = {
"NO" : "Norge",
"DK" : "Danmark"
}
print(land)
land["DK"] = "Donkey Kong" # Nøkkelen "DK" får en ny verdi "Donkey Kong" 🐒
print(land)
{'NO': 'Norge', 'DK': 'Danmark'}
{'NO': 'Norge', 'DK': 'Donkey Kong'}
Vi kan fjerne data ved å bruke pop()
-metoden.
land = {
"NO" : "Norge",
"SE" : "Sverige",
"DK" : "Danmark"
}
land.pop("NO") # Fjerner både nøkkel og verdi for nøkkelen "NO"
print(land)
{'SE': 'Sverige', 'DK': 'Danmark'}
Løkker og ordbøker#
Vi kan gå igjennom ordbøker med for
-løkker på denne måten.
land = {
"NO" : "Norge",
"SE" : "Sverige"
}
for x in land:
print("Nøkkel:", x) # Skriver ut nøkkelen
print("Verdi:", land[x]) # Skriver ut verdien til nøkkelen
Nøkkel: NO
Verdi: Norge
Nøkkel: SE
Verdi: Sverige
Counter
#
En Counter
er en spesiell ordbok som fungerer ekstremt godt til å telle opp ting.
from collections import Counter
tekst = "😎😋😎😆😉😉😉😉😉😋😆😘😅😘😆😉😋😉😋😅😍😉😋😎😍😆😋😆😉"
# Lager en counter
tekst_counter = Counter()
# Går gjennom hver emoji
for emoji in tekst:
tekst_counter[emoji] += 1
# Skriver ut alle counts
print(tekst_counter)
# Skriver ut liste over topp 3
print(tekst_counter.most_common(3))
Counter({'😉': 9, '😋': 6, '😆': 5, '😎': 3, '😘': 2, '😅': 2, '😍': 2})
[('😉', 9), ('😋', 6), ('😆', 5)]
Dette hadde ikke funket på en vanlig ordbok
Hvis vi hadde tatt tekst_counter[emoji] += 1
på en vanlig ordbok, hadde vi fått en KeyError
.
Det finnes måter rundt dette, men å bruke en Counter
er det enkleste.
Oppgaver#
Oppgave 1 🎒
Lag en ordbok elev
som skal ha fag som nøkler og karakterer som verdier. Den kan starte slik
elev = {
"Norsk" : 4,
"Gym" : 3
}
Legg til fire nye fag og karakterer. Du kan bestemme både fag og karakterer.
Lag en løkke som skriver ut alle fagene og karakterene med en setning
Eleven har <karakter> i faget <fag>
.Finn og skriv ut karaktersnittet til eleven.
Oppgave 2 🔤
Vi finner en ordsum ved å gi hver bokstav en tallverdi basert på plasseringen i alfabetet.
For eksempel er ordsummen av ordet
BOB
lik \(2 + 15 + 2 = 19\)
Du kan få bruk for ordboken under for å løse oppgaven.
bokstav_verdi = {"A":1,"B":2,"C":3,"D":4,"E":5,"F":6,"G":7,"H":8,"I":9,"J":10,"K":11,"L":12,"M":13,"N":14,"O":15,"P":16,"Q":17,"R":18,"S":19,"T":20,"U":21,"V":22,"W":23,"X":24,"Y":25,"Z":26,"Æ":27,"Ø":28,"Å":29}
Hva er ordsummen av ordet PREIMPLANTASJONSDIAGNOSTIKKNEMNDA
?
Oppgave 3 🌹
Dette er en fortsettelse av denne oppgaven om mengder
Shakespeares fortelling om den forbudte forelskelsen mellom Romeo Montague og Juliet Capulet er en rivende kjærlighetshistorie med mange dramatiske vendinger.
Last ned filen romeo_and_juliet.txt
Skriv ut de ti mest brukte ordene i hele tekstfilen og hvor mange ganger de har blitt brukt.
Små og store bokstaver teller ikke som forskjellige ord.
"Word"
telles som det samme ordet som"word"
Tegnene
","
,")"
,"("
,"."
,";"
,":"
,"_"
,"]"
,"["
,"?"
,"!"
skal ignoreres."Word!"
telles som det samme ordet som"Word"
og"Word."
.
Tekst tatt fra Project Gutenberg (lenke).
Hint
Denne listen kan være til hjelp med å rense ordene.
tegn = [",", ")", "(", ".", ";", ":", "_", "]", "[", "?", "!"]
Fasit
THE : 874
AND : 803
TO : 623
I : 580
A : 541
OF : 518
IN : 393
IS : 366
YOU : 362
THAT : 361
Løsningsforslag
from collections import Counter
def fjern_tegn(word : str) -> str:
"""Hjelpefunksjon for å fjerne tegn som ikke er bokstaver fra ordene"""
for tegn in [",", ")", "(", ".", ";", ":", "_", "]", "[", "?", "!"]:
word = word.replace(tegn, "")
return word
with open("romeo_and_juliet.txt", encoding="utf8") as file:
word_dict = Counter()
for line in file.readlines():
if line.strip() != "":
for word in line.strip().split():
word_dict[fjern_tegn(word.upper())] += 1
for x in word_dict.most_common(10):
print(f"{x[0]:5}:{x[1]:5}")