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:
-
Varför måste värdena i resultat-dictionaryt vara listor?
- Ledtråd: Vad händer om två nycklar har samma värde?
-
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?
- 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.
- 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:
|
|
(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:
|
|
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