Uke 8

Innlevering, Krav for å bestå og viktigheten av bonusoppgaver

Generelt tips: les alltid gjennom kursnotatene før du begynner på lab’en!

Vi vil også anbefale at du blir kjent med bruken av Python-dokumentasjonen, der det finnes en fullstendig liste over alle operasjoner, metoder og funksjoner relatert til Dictionaries og Sets, som kan brukes som en referanse. Dict, og Set.

Oppgave 1

I filen uke_08_oppg_1.py, lag funksjonen shopping_list_to_dict med en parameter shopping_list som er en streng som innholder en handleliste. Funksjonen skal returnere et oppslagsverk med varer som nøkler og antall som verdier. Du kan anta at strengen består av flere linjer, hvor hver linje (som ikke er tom) består av først et heltall, deretter et mellomrom, og deretter navnet på varen (uten mellomrom).

print("Tester shopping_list_to_dict... ", end="")
shopping_list = """\
2 brød
3 pizza
10 poteter
1 kaffe
1 ost
14 epler
"""
shopping_dict = shopping_list_to_dict(shopping_list)
assert({
    "brød": 2,
    "pizza": 3,
    "poteter": 10,
    "kaffe": 1,
    "ost": 1,
    "epler": 14,
} == shopping_dict)
print("OK")
Oppgave 2

Denne oppgaven er videreføring av oppgave 2 i uke 6 der vi har laget en funksjon som retunerer en liste av alle k-mers i en DNA-sekvens.

k-mere er nyttige først og fremst fordi de kan bidra til å gjenkjenne overlappende regioner mellom sekvenser. En måte å gjøre dette på er å finne kmer-frekvens(antall ganger delstrenger repeterer seg i en DNA seqvens).

I filen uke_08_oppg_2.py lag en funksion som heter kmercount(seq, k) som returnerer en oppslagsverk som inneholder kmere som key og frekvens som verdi. for eksempel kmercount("CGTACGT",3) bør retunere {'CGT' : 2, 'GTA' : 1, 'TAC' : 1, 'ACG': 1}

print("Tester kmercount... ", end="")
f1= {'TCA' : 2,
     'CAG' : 1,
     'AGG' : 1,
     'GGA' : 1,
     'GAT' : 1,
     'ATC' : 3,
     'CAT' : 1,
     'TCG' : 1,
     'CGC' : 1,
     'GCT' : 1,
     'CTA' : 1,
     'TAT' : 2,
     'ATA' : 1,
     'TCT' : 1}
assert f1 ==  kmercount("TCAGGATCATCGCTATATCT",3)

f2 ={'ACTAG' : 1,
     'CTAGA' : 1,
     'TAGAT' : 1,
     'AGATA' : 1,
     'GATAC' : 1,
     'ATACT' : 1,
     'TACTA' : 1}
assert f2 == kmercount("ACTAGATACTA",5)

f3 =  {"ATGCAGCTGTGT" : 1}
assert f3 == kmercount("ATGCAGCTGTGT",12)

f4 = {}
assert f4 == kmercount("ATGCAGCTGTGT",13)
print("OK")

Oppgave 3

I denne oppgaven skal vi bruke et oppslagsverk som igjen inneholder oppslagsverk med informasjon fra en værtjeneste:

yr= {
    "Bergen": {
        "Temperatur": 10,
        "Nedbør": 100,
        "Vindkast": 12.5,
        "Vindretning": "nordøst",   
    },
    "Trondheim": {
        "Temperatur": 5,
        "Nedbør": 8.2,
        "Vindkast": 8.6,
        "Vindretning": "øst",
    },
    "Svalbard": {
        "Temperatur": -10,
        "Nedbør": 0.0,
        "Vindkast": 7.6,
        "Vindretning": "vest",
    },
}

I filen uke_08_oppg_3.py, lag en funksjon værvarsel(by,tjeneste) som tar in et bynavn og retunerer værrapporten til denne byen. Retunert værrapporten skal ha samme format som i testkode nedenfor.

Testkode:

værvarsel_for_bergen = """\
Ifølge yr vil temperaturen i Bergen være rundt 10 grader i dag.
Det vil også være en nedbørsmengde på opptil 100 mm i løpet av ett døgn.
Vinden vil komme fra nordøst og kan nå vindkast på opptil 12.5 m/s."""
assert værvarsel_for_bergen == værvarsel("Bergen",yr)
Oppgave 4

I filen uke_08_oppg_4.py, skriv funksjonen key_value_getter(d) som tar inn en dictionary d, og returnerer nøklene, verdiene og nøkkel/verdi-par. Returverdien skal ha samme format som key_val-variablen i testkoden.

Testkode:

d={
  "monday": 0,
  "tuesday": 0.7,
  "wednesday": 0,
  "thursday": 4.7,
  "friday": 10
}

key_val ="""\
Dictionary keys:
monday
tuesday
wednesday
thursday
friday
Dictionary values:
0
0.7
0
4.7
10
Dictionary keys/values:
monday 0
tuesday 0.7
wednesday 0
thursday 4.7
friday 10"""
assert(key_val==key_value_getter(d))

For å bygge opp en streng over flere linjer er det nyttig å lage en liste med linjene først, og så kombinere dem med join. Kjør koden for å se hva som skrives ut. Deretter kan du erstatte koden mellom ############### med din egen løsning til oppgaven.

def key_value_getter(d):
    lines = []
     ###############
    # erstatt meg 
    lines.append("Adding a string to list:")
    lines.append("String")
    lines.append("Adding ints to list as string:")
    for i in range(2):
        lines.append(f"{i}")
    lines.append("Adding more than one value per line:")
    a = "A"
    b = (3,2)
    lines.append(f"{a} {b}")
    # erstatt meg 
     ###############
    # sette sammen alle linjene med linjeskift
    final = "\n".join(lines)
    return final

print(key_value_getter(d))

Oppgave 5

I filen uke_08_oppg_5.py, skriv en funksjon som heter word_comparison() og som tar to ord (strenger) som argumenter. Funksjonen skal så sammenligne bokstavene i ordene og returnere en dictionary som sier hvilke bokstaver finnes i begge ordene, hvilke bokstaver som finnes i kun det første ordet og hvilke bokstaver som finnes i kun det andre ordet. Bokstavene skal samles i en mengde (set). Husk at rekkefølgen ikke spiller noen rolle i mengder. Se på dokumentasjonen til set, det finnes nyttige funksjoner der.

print("Tester word_comparison... ", end="")
assert({
  "In common": {"e", "c"},
  "Unique to first word": {"r", "u", "t", "p", "o", "m"},
  "Unique to second word": {"s", "i", "n"},
} == word_comparison("computer", "science"))
print("OK")
Bonus 1

Fantasy Game Inventory fra boken https://automatetheboringstuff.com/2e/chapter5/

Du lager et fantasy-videospill. Datastrukturen for å modellere spillerens beholdning skal være en dictionary hvor nøklene er strings som beskriver tingene i beholdningen, og verdiene er integers som forteller hvor mange av hver ting som spilleren har. For eksempel, verdiene i dictionary {'rope': 1, 'torch': 6, 'gold coin': 42, 'dagger': 1, 'arrow': 12} betyr at spilleren har 1 rope, 6 torches, 42 gold coins, etc.

Skriv funksjonen displayInventory() som tar inn en dictionary av beholdningen og returneres totalt antall i formaten i eksempelkjøringen nedenfor.

stuff = {"rope": 1, "torch": 6, "gold coin": 42, "dagger": 1, "arrow": 12}
print(displayInventory(stuff))
Inventory:
1 rope
6 torch
42 gold coin
1 dagger
12 arrow
62

Funksjonen skal i dette eksemplet returnere tallet \(62\) (den siste linjen)

Bonus 2

Dragon Hoard fra boken https://automatetheboringstuff.com/2e/chapter5/

Skatten til en beseiret drage er representert som en liste med strenger som dette: dragonLoot = ['gold coin', 'dagger', 'gold coin', 'gold coin', 'ruby']

Skrive funksjonen som heter addToInventory(inventory, addedItems), hvor inventory parameteren er en dictionarien av spillerens beholdning og addedItems parameteren er en liste som f.eks dragonLoot.

addToInventory() funksjonen skal returnere en dictionary som representerer den oppdaterte beholdningen. Merk at listen over tilleggsartikler kan inneholde flere av samme element.

Om du kaller displayInventory() etter å ha oppdatert beholdingen med addToInventory() funksjonen skal du få ut likt som nedenfor:

inv = {"gold coin": 42, "rope": 1}
dragonLoot = ["gold coin", "dagger", "gold coin", "gold coin", "ruby"]
inv = addToInventory(inv, dragonLoot)
print(displayInventory(inv))
Inventory:
45 gold coin
1 rope
1 dagger
1 ruby
48

og displayInventory() skal returnere tallet \(48\).