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

Storseminarium 3.1 - Experimentering

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

Under seminariet

Ni kommer att arbeta med uppgifterna tillsammans i mindre grupper, där ni diskuterar och förklarar för varandra, handledarna kommer att finnas till hjälp som under vanligt labb pass. Efter varje uppgift går handledarna igenom sin lösning i helklass, då finns möjlighet att ställa frågor och presentera alternativa lösningar.

Dictionaries

Skriv en funktion dict_func som 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.

Exempel:

>>> input_dict = {'a': 1, 'b': 2, 'c': 1}
>>> print(dict_func(input_dict))
{1: ['a', 'c'], 2: ['b']}

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?

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