Göm meny
Gäller för: HT25

Storseminarium 3.1 - En sak i taget

Innan seminariet ska du ha gått igenom Inför seminariet nedan och gjort tillhörande quiz. Syftet med detta är att du ska bekanta dig med innehållet så eventuella frågor kan redas ut under seminariet.

Denna sida visar en del av det som kommer att diskuteras på seminariet. Det kan hända att handledarna också tar upp andra uppgifter som inte behöver något specifikt studiematerial och då syns dessa uppgifter inte på sidan.

Inför seminariet

Dictionaries

Vad gör följande funktion? Diskutera i grupper. Testkör gärna koden med en lämplig dict för att se vad som händer.

def dict_func(dict):
    result = {}

    for key in dict:
        if dict[key] in result:
            result[dict[key]].append(key)
        else:
            result[dict[key]] = [key]
    return result

Funktionen dict_func tar ett dictionary som argument och returnerar ett nytt dictionary där nycklarna är värdena från det ursprungliga dictionaryt och värdena är listor med alla nycklar från det ursprungliga dictionaryt som hade det värdet.

Ytterligare diskussionsfrågor:

  1. Varför måste värdena i resultat-dictionaryt vara listor?

    • Ledtråd: Vad händer om två nycklar har samma värde?
  2. Vad finns det för begränsningar med denna funktion?

    • Ledtråd: Vad händer om det ursprungliga dictionaryt har listor eller andra dictionaries som värden?
  1. Vi vet att nycklar måste vara unika men värden behöver inte vara det. Genom att använda en lista som värde i “inversen” av det ursprungliga dictionaryt kan vi samla alla nycklar som delar samma värde i det ursprungliga dictionaryt. Skulle vi försöka “invertera tillbaka” det ursprungliga dictionaryt skulle vi dock få problem eftersom listor är muterbara och därmed inte kan användas som nycklar i ett dictionary.
  2. Funktionen förutsätter att värdena i det ursprungliga dictionaryt är oföränderliga (dvs. kan användas som nycklar i ett dictionary). Detta innebär att värdena inte kan vara listor eller andra dictionaries. Om det ursprungliga dictionaryt har listor eller andra dictionaries som värden, kommer funktionen att krascha eftersom dessa typer är muterbara och därmed inte kan användas som nycklar i resultat-dictionaryt

Nästlade datastrukturer

Ett dictionary används för att lagra information om en läsgrupps lästa böcker. Detta dictionary innehåller boktitlar som nycklar vilka har varsitt inre dictionary som värde. Dessa inre dictionaries innehåller antalet sidor boken har under nyckeln 'pages' samt vilka personer som läst boken under nyckeln 'read_by'. Exempelvis:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
cs_reading_group = {
    'The Wizard Book': {
        'pages': 657, 'read_by': ['Alan', 'Grace']
    },
    'The Dragon Book': {
        'pages': 1040, 'read_by': ['Margaret', 'Grace']
    },
    'The Dinosaur Book': {
        'pages': 896, 'read_by': ['John', 'Alan', 'Margaret']
    },
    'The Cinderella Book': {
        'pages': 500, 'read_by': ['Alan', 'Grace', 'John']
    }
}

(För den som är nyfiken: The Wizard Book, The Dragon Book, The Dinosaur Book, The Cinderella Book. Vill man bläddra finns de första 3 på Johans kontor och vi bör kunna gräva fram den sista någonstans i närheten också.)

Vi ska nu skriva funktioner som kan svara på några olika frågor med hjälp av data på det här formatet.

all_members

Skriv en funktion all_members(reading_log) som returnerar en lista med alla medlemmar i bokklubben. Antag att alla medlemmar har läst åtminstone någon av böckerna.

Exempel

>>> all_members(cs_reading_group)
['John', 'Margaret', 'Alan', 'Grace']

books_read_by

Skriv en funktion books_read_by(reading_log, member) som returnerar en lista med alla böcker som medlemmen member har läst. Antag att member förekommer i datan.

Exempel

>>> books_read_by(cs_reading_group, 'Alan')
['The Wizard Book', 'The Dinosaur Book', 'The Cinderella Book']

pages_read_by

Den här uppgiften har tidigare varit med på duggan.

Skriv funktionen pages_read_by(reading_log, person) som givet ett dictionary enligt ovan returnerar det totala antalet sidor som en person har läst. Om personen inte läst några av böckerna returneras 0 (se sista exemplet nedan).

Exempel

Givet 'cs_reading_group' enligt ovan:

1
2
3
4
5
6
>>> pages_read_by(cs_reading_group, 'Alan')
2053
>>> pages_read_by(cs_reading_group, 'Margaret')
1936
>>> pages_read_by(cs_reading_group, 'Daniel')
0

total_pages_read

Skriv funktionen total_pages_read(reading_log) som givet ett dictionary enligt ovan returnerar det totala antalet sidor samtliga medlemmar har läst tillsammans.

Exempel

>>> total_pages_read(cs_reading_group)
7582

add_book

Skriv en funktion add_book(reading_log, title, pages) som tar en läslogg enligt ovan, boktitel som en sträng och ett antal sidor. Funktionen skall lägga till en ny bok till läsloggen utan några läsare. Om title redan finns i läsloggen skall ingenting ändras.

(För den som är nyfiken: The Camel Book)

Exempel

>>> add_book(cs_reading_group, 'The Camel Book', 1184)
>>> for book, data in cs_reading_group.items():
    print(f"{book}:\n    {data}")
The Wizard Book:
    {'pages': 657, 'read_by': ['Alan', 'Grace']}
The Dragon Book:
    {'pages': 1040, 'read_by': ['Margaret', 'Grace']}
The Dinosaur Book:
    {'pages': 896, 'read_by': ['John', 'Alan', 'Margaret']}
The Cinderella Book:
    {'pages': 500, 'read_by': ['Alan', 'Grace', 'John']}
The Camel Book:
    {'pages': 1184, 'read_by': []}

add_reader

Skriv en funktion add_reader(reading_log, title, reader) som tar en läslogg enligt ovan, boktitel som en sträng och namnet på en läsare som en sträng. Funktionen skall lägga till läsaren reader till boken title. Om title inte finns i läsloggen eller reader redan finns i läsarlistan för title så skall ingenting ändras.

Exempel

>>> add_reader(cs_reading_group, 'The Wizard Book', 'Margaret')
>>> for book, data in cs_reading_group.items():
    print(f"{book}:\n    {data}")
The Wizard Book:
    {'pages': 657, 'read_by': ['Alan', 'Grace', 'Margaret']}
The Dragon Book:
    {'pages': 1040, 'read_by': ['Margaret', 'Grace']}
The Dinosaur Book:
    {'pages': 896, 'read_by': ['John', 'Alan', 'Margaret']}
The Cinderella Book:
    {'pages': 500, 'read_by': ['Alan', 'Grace', 'John']}

Sidansvarig: Johan Falkenjack
Senast uppdaterad: 2025-09-27